java - 并发加载文件时如何确定线程数

标签 java multithreading

我正在编写代码来解决这样的问题。 大约有 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/

相关文章:

Java 8 从列表中删除重复的字符串而不考虑大小写

java - 向对象添加点而不覆盖现有点

c++ - 具有 "blocking"pop 的单一生产者单一消费者队列

c# - 在 C# 控制台应用程序中使用 async 和 await 异步处理文件列表

c - 警告 : ‘noreturn’ function does return

java - 如何使用 java.nio.channels.FileChannel 读取 ByteBuffer 实现类似 BufferedReader#readLine() 的行为

java - org.mockito.exceptions.misusing.MissingMethodInitationException

java - Android - RecyclerView 项目未显示

c++ - 为多线程锁定一部分内存

python - 为什么python线程中的代码示例中有空格