我正在编写代码来解决这样的问题。 大约有 50 - 200 个小文件。而且这些文件的总大小不会很大。我的目标是同时将它们加载到一张表中。
看起来代码运行得很好,而且确实比使用单线程运行得更快。
不过,我只是有点不确定。开多少线程才是最好的选择?
另一件事是我只是用最简单的方法来做多线程。 这也是最好的选择吗?
如有任何建议或建议,我们将不胜感激!
for (int i = 0; i < threads.length; ++i) {
synchronized (threads[i]) {
threads[i].run();
}
}
for (int i = 0; i < threads.length; ++i) {
synchronized (threads[i]) {
try {
threads[i].join();
} catch (InterruptedException e1) {
return;
}
}
}
最佳答案
第一件事:线程是用start()
启动的,而不是run()
。 run()
将使它们在主线程上串行运行。
第二件事:启动 200 个线程毫无意义。您只是在浪费时间和系统资源而没有得到任何加速(您不能比处理器核心数量更快)。只需使用 ExecutorService并使用 submit
排队任务。此托管线程池将负责根据您的系统资源选择正确的线程数。
第三件事:如果你只是独立处理一些文件,你不需要任何锁。特别是在您的示例中,您使用锁来启动和加入线程,这没有(积极的)效果。
编辑:在您的情况下,最好的解决方案可能是仅实现单一生产者(从磁盘读取)、多消费者(处理文件)系统。
关于java - 并发加载文件时如何确定线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8368114/