我想读取.txt的行来执行任务,然后继续下一行。
为了使程序更快,我想要多线程,所以每个线程都尝试一行。
问题是,我不希望线程1尝试与线程2相同的行。
有什么想法吗?
答案 0 :(得分:4)
我建议您使用一个线程进行所有读取,然后将这些行放入生产者/消费者队列(例如LinkedBlockingQueue
) - 然后您可以为该队列提供多个线程作为消费者。
你真的不希望多个线程在这里执行IO - 即使你有多个独立的BufferedReaders
,如果你从传统的磁盘中读取你不想在多个地方寻找。生产者/消费者队列非常简单地将读数与处理分开 - 并且更容易单独测试每个部分。
答案 1 :(得分:0)
您可以在一个线程中读取行并为每一行分派一个工作线程:
try (BufferedReader reader = new BufferedReader(new FileReader("my.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
new Runnable() {
void run() {
// do stuff with line
}
}.run();
}
}
答案 2 :(得分:0)
我对您要实现的目标有所了解,但不确定如何编写代码。 如果你可以使每个线程在不同的行集上工作,那么线程就不会发生冲突。 我的意思是让thread1从1读取到100,thread2从101读取到200,依此类推。 最后,加入所有线程的结果以获得最终结果。 也许是Fork / Join操作。
但@Jon评论让我对遵循这样的方法持谨慎态度。
“你真的不希望多个线程在这里执行IO - 即使你有多个独立的BufferedReader,如果你正在阅读传统的磁盘,你不想最终在多个地方寻找..