我目前编写的程序使用32个线程,每个线程读取1个文件(所以32个.txt文件)。多线程与CPU速度无关,但是每秒对BING的api进行32次调用要快得多1.每个.txt文件都包含一个搜索查询列表。我创建一个线程,它从文件中一次读取一行。是否可以创建所有32个线程并将它们指向单个.txt文件?
答案 0 :(得分:12)
使用Producer-Consumer模式。只有一个线程读取文件并使用ArrayBlockingQueue将每个行/命令推送到put()
(线程安全读写)。
所有其他32个线程应通过调用take()
从同一队列对象中读取。如果队列为空,它们将阻塞,这很好。
这个解决方案更好,因为磁盘本质上是单线程的,所以通过同时读取文件你不会得到太多。
答案 1 :(得分:0)
您可以同步处理文件的代码。每次写入文件时都会打开,写入并关闭它。使用监视器实现它应该没问题。
还可以使用java util logging,因为它是线程安全的。如果你实现了一个处理程序,那么记录api应该处理线程安全问题。
答案 2 :(得分:0)
这取决于这些线程的实现方式。如果每个文件都有自己的读者或输入流,那么并发读取可能不是什么大问题。除非操作系统上的JVM实现在其上打开输入流时隐式锁定文件,并且无法跨流共享锁。
但说实话,你会做很多不必要的工作。最好将对文件的访问封装在一个单独的类中,并将其实例传递给您的线程,然后让该类进行必要的并发处理。