gpt4 book ai didi

java - 4个线程还是8个,线程执行时间是一样的

转载 作者:行者123 更新时间:2023-11-30 08:48:57 24 4
gpt4 key购买 nike

最初我有(例如 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. 好吧,假设我有 1 个 8 核处理器
  2. ArrayList 100行
    1个线程将在1分钟内处理数组

  3. 然后我将 100 行拆分为两个不同的 ArrayList 对象,每个对象有 50 行

  4. 将这些数组传递给不同的线程

2个线程应该在30秒内处理完数组中的数据

我说得对吗?
如果我说得对,那为什么它在我的情况下不起作用?
如果您需要我的代码的任何部分,我会在这里发布我需要摆脱它

这是分析结果。请检查一下 Threads time line

Locks and Threads 1

Locks and Threads 2
最终,我在我的程序中找到了狭窄的地方。
似乎从多个线程读取单个输出流。

当我注释行 readLine() 时,我的程序运行两次,根据线程数快四倍。

所以问题是,这一行有什么问题?
我在线程内创建了 BufferedReader,它不是应该针对每个线程吗?

最佳答案

我的建议是分析代码以查看大部分时间花在了哪些地方。

人们在多线程应用程序中看不到太多加速的常见原因是:

  • 应用程序的重要部分是单线程的。

  • 多线程部分的性能取决于(例如)实际上是单线程或资源(例如 CPU 或 I/O)受限的外部数据库。

  • 线程正在争用某些东西(例如锁、内存/缓存访问)并降低吞吐量。

  • 您没有足够的核心来产生重大影响。

如果没有看到几乎所有的代码,就无法预测其中一个是您的问题……还是其他问题。

关于java - 4个线程还是8个,线程执行时间是一样的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31673949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com