最初我有(例如2 000 000行数据要处理)
我有ArrayList<ArrayList<SubsData>> threads
。
SubsData是一个类。
在循环中,我根据给定的线程数填充数组; 因此,如果我有更多线程,那么每个ArrayList将有更少的数据要处理。
然后在这里我将数据数组传递给某个线程并运行它。 `
for (int i = 0; i < threads.size(); i++)
{
ArrayList<SubsData> thread = threads.get(i);
Worker w = hlrSockets.get(i);
DButilities db = dbSockets.get(i);
Collation performCollation = new Collation(thread,w, db);
new Thread(performCollation, "collateThread #" + i).start();
}
`
但如果我运行8个或16个线程并不重要,那么线程执行时间就不会变化。
ArrayList中的100行
1个线程将在1分钟内处理数组
然后我在两个不同的ArrayList对象中分割100行,每行对应50行
2个线程应该在30秒内处理数组中的数据
我是对的吗?
如果我是,那为什么它不适用于我的情况?
如果您需要我的代码的任何部分,我会在这里发布喊
我需要摆脱它
最终,我在我的程序中找到了狭窄的地方
从多个线程看来,我从单个输出流中读取。
当我对readLine()行进行注释时,我的程序运行两次,根据线程数量运行速度快四倍。
所以问题是,这条线有什么问题?
我在一个Thread中创建了BufferedReader,它不是特定于每个线程吗?
答案 0 :(得分:2)
我的建议是对代码进行分析,以查看大部分时间花在哪里。
人们在多线程应用程序中没有看到太多加速的常见原因是:
该应用程序的一个重要部分是单线程。
多线程部分的性能取决于(例如)有效的单线程或资源(例如CPU或I / O)约束的外部数据库。
线程正在争夺某些东西(例如锁定,访问内存/缓存)和降低吞吐量。
您没有足够的核心来发挥重要作用。
如果没有看到你的所有代码,就不可能预测其中一个是你的问题......还是别的什么。
答案 1 :(得分:0)
如果使用不同的用例,多线程可能会有效:
并且存在多线程可能更糟的用例: