2011-11-14 41 views
2

我目前编写我的程序使用32个线程并读取每个线程1个文件(所以32个.txt文件)。多线程与CPU速度无关,但每秒32次调用BING的api要比制作1快得多。每个.txt文件都包含一个搜索查询列表。我创建一个线程,它从文件中一次读取一行。是否有可能创建所有32个线程并将它们指向一个.txt文件?Java多线程应用程序读取单个文件

+2

我正在解析大文本文件,我通常这样做:一个生产者正在做I/O,然后放入一个队列,然后尽可能多的消费者,因为我想从队列中获取作业。在你的情况下,你的唯一生产者可以读取txt文件并在队列中放入每行一个条目。 – TacticalCoder

回答

12

使用生产者 - 消费者模式。只有一个线程读取文件,并使用put()将每行/命令推入ArrayBlockingQueue(线程安全读写)。

所有其他32个线程都应通过调用take()从同一队列对象读取。如果队列是空的,它们会阻塞,这很好。

该解决方案更好,因为磁盘本质上是单线程的,因此您不会通过同时读取文件获得太多收益。

+0

谢谢,这使得改变输入比有32个单独的文件更容易。 – chrstahl89

0

您可以同步处理文件的代码。每次您写入您打开的文件,写入并关闭它。使用监视器来实现,它应该没问题。

也可以使用java util日志,因为它是线程安全的。如果你实现一个处理程序,那么记录API应该关注线程安全问题。

+0

这个问题没有涉及任何文字,这与日志记录没有关系。 –

0

这取决于这些线程是如何实现的。如果每个文件都有自己的阅读器或输入流,那么并发阅读可能不是什么大问题。除非操作系统上的JVM实现在打开输入流时隐式锁定文件,并且锁不能跨流共享。

但是你会做很多不必要的工作,说实话。将对文件的访问封装在一个单独的类中并将其实例传递给线程会更好,然后让该类执行必要的并发处理。