【发布时间】:2015-07-28 10:40:27
【问题描述】:
最初我有(例如要处理的 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个线程,线程执行时间都没有变化。
-
好吧,假设我有 1 个 8 核处理器
ArrayList 中有 100 行
1 线程将在 1 分钟内处理数组然后我将 100 行拆分为两个不同的 ArrayList 对象,每个对象有 50 行
- 将这些数组传递给不同的线程
2 个线程应在 30 秒内处理数组中的数据
我是对的吗?
如果我是对的,那为什么它在我的情况下不起作用?
如果您需要我的代码的任何部分,我会在此处发布,只需大喊
我需要摆脱它
最终,我在我的程序中找到了狭窄的地方。
我似乎从多个线程读取单个输出流。
当我注释 readLine() 行时,我的程序运行两次,根据线程数快四倍。
所以问题是,这条线有什么问题?
我在线程内创建 BufferedReader,难道不是每个线程都特定吗?
【问题讨论】:
-
你有几个核心?如果所有核心都忙,添加更多线程有什么帮助?
-
你的硬件是什么?您的机器是否有足够的内核来并行运行所有线程?
-
我有 8 核 Corei7。
-
这里是 2 个线程的线程执行的输出 Thread pool-1-thread-1 已启动;要处理的子程序:893 Thread pool-1-thread-2 已启动;要处理的子程序:889 线程池 1-线程 2 已完成;执行时间(秒):55 已处理:889 Thread pool-1-thread-1 已完成;执行时间(秒):56 已处理:893
-
没有“插入/更新/删除”,它只是选择我按索引选择数据,所以它很快它只取决于我从数据库中获取信息的数组中的记录数量。
标签: java arrays multithreading memory