4个线程或8个,线程执行时间相同

时间:2015-07-28 10:40:27

标签: java arrays multithreading memory

最初我有(例如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. 然后我在两个不同的ArrayList对象中分割100行,每行对应50行

  4. 将这些数组传递给不同的线程
  5. 2个线程应该在30秒内处理数组中的数据

    我是对的吗?
    如果我是,那为什么它不适用于我的情况?
    如果您需要我的代码的任何部分,我会在这里发布喊 我需要摆脱它

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

    Locks and Threads 1

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

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

    所以问题是,这条线有什么问题?
    我在一个Thread中创建了BufferedReader,它不是特定于每个线程吗?

2 个答案:

答案 0 :(得分:2)

我的建议是对代码进行分析,以查看大部分时间花在哪里。

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

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

  • 多线程部分的性能取决于(例如)有效的单线程或资源(例如CPU或I / O)约束的外部数据库。

  • 线程正在争夺某些东西(例如锁定,访问内存/缓存)和降低吞吐量。

  • 您没有足够的核心来发挥重要作用。

如果没有看到你的所有代码,就不可能预测其中一个是你的问题......还是别的什么。

答案 1 :(得分:0)

如果使用不同的用例,多线程可能会有效:

  • 当处理必须等待外部事件(具有多个外部客户端的服务器)时
  • 用于CPU绑定处理,最多可达核心数

并且存在多线程可能更糟的用例:

  • 用于磁盘IO绑定处理(既不应增加也不应显着减少)
  • 用于数据库绑定处理(更高的锁争用风险可能会降低性能)