Java 如何在同时加载文件时确定线程数

Java 如何在同时加载文件时确定线程数,java,multithreading,Java,Multithreading,我正在编写代码来解决这样的问题。 大约有50-200个小文件。这些文件的总大小不会很大。我的目标是将它们同时加载到一个表中 看起来代码运行得很好,而且比使用单线程运行得更快 然而,我只是有点不确定。打开的线程数与打开的文件数一样多,这是最佳选择吗 另一件事是我只是用最简单的方法来做多线程。 这也是最好的选择吗 任何建议或建议都将不胜感激 for (int i = 0; i < threads.length; ++i) { synchroni

我正在编写代码来解决这样的问题。 大约有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;
                            }
                        }
                    }
for(int i=0;i
您的代码不会启动任何线程。所以你的尺寸一定是错的。使用
start()
方法启动线程。还不太清楚同步块应该做什么。同步块用于确保某个可变共享状态一次只能由一个线程访问。但在同步块中,您不会访问任何可变的共享状态


我怀疑使用多个线程从单个磁盘加载文件会比只使用一次更快,因为您将支付上下文切换的费用,并且您还将支付迫使磁盘频繁更改其读取位置而不是一次读取整个文件的费用。

您的代码不会启动任何线程。所以你的尺寸一定是错的。使用
start()
方法启动线程。还不太清楚同步块应该做什么。同步块用于确保某个可变共享状态一次只能由一个线程访问。但在同步块中,您不会访问任何可变的共享状态


我怀疑使用多个线程从一个磁盘加载文件会比只加载一次更快,因为您将支付上下文切换的费用,并且您还将支付迫使磁盘频繁更改其读取位置而不是一次读取整个文件的费用。

第一件事:线程是从
start()
开始的,不
run()
run()
将使它们在主线程上连续运行

第二件事:启动200个线程是没有意义的。您只是在浪费时间和系统资源,而没有获得任何加速(您的速度不可能比处理器内核的数量快一倍)。只需使用一个命令,并使用
提交
将任务排队即可。此托管线程池将负责根据您的系统资源选择正确的线程数

第三件事:如果你只是独立处理一些文件,你不需要任何锁。特别是在您的示例中,您使用锁来启动和连接线程,这没有(积极的)效果


编辑:在您的情况下,最好的解决方案可能是只实现一个生产者(从磁盘读取)、多消费者(处理文件)系统。

第一件事:线程是从
start()
开始的,而不是
run()
run()
将使它们在主线程上连续运行

第二件事:启动200个线程是没有意义的。您只是在浪费时间和系统资源,而没有获得任何加速(您的速度不可能比处理器内核的数量快一倍)。只需使用一个命令,并使用
提交
将任务排队即可。此托管线程池将负责根据您的系统资源选择正确的线程数

第三件事:如果你只是独立处理一些文件,你不需要任何锁。特别是在您的示例中,您使用锁来启动和连接线程,这没有(积极的)效果


编辑:在您的情况下,最好的解决方案可能是只实现一个生产者(从磁盘读取)、多消费者(处理文件)系统。

run()
不启动线程:)我认为两个线程是最有效的解决方案,这意味着一个线程可以处理当前获取的数据,而另一个线程已发出读取命令并等待磁盘返回数据。我不知何故怀疑,多线程的代码将大大提高性能-显然,IO在这方面是有限的。但这仅仅表明,学习如何测量物质是重要的——安慰剂效应在这里很强:D@ClarkBao您的代码是单线程的。如果你声称与其他单线程版本相比有任何改进,你就必须去别处看看。@Voo然后我试图改变使用ExecutorService,正如都铎所说的,并使用两个线程,因为我的电脑中只有两个处理器。它似乎快了一点。但是如果我打开更多线程,内存中的derby DB有时会抱怨它正在等待锁,因此这让我怀疑它的并发能力。由于加载过程只允许我输入文件名,所以我在分离读取文件功能时也遇到了麻烦。除非我想自己重写。
run()
不会启动线程:)我希望两个线程是最有效的解决方案,这意味着一个线程可以处理当前获取的数据,而另一个线程已发出读取命令并等待磁盘返回数据。我不知何故怀疑,多线程的代码将大大提高性能-显然,IO在这方面是有限的。但这只是表明,学习如何