【问题标题】:Thread Pool performance线程池性能
【发布时间】:2014-11-22 08:09:06
【问题描述】:

我试图了解使用线程池的优势,我编写了这段代码来查看固定线程池的时间改进。

首先,我将池中的线程数设置为 1,大约需要 920 毫秒,然后我将池中的线程数更改为 2(以及 3、4、5、6、7...)而且用了1200ms,线程并发运行不应该更快吗?

当我将其更改为缓存线程池时,也需要 1200 毫秒

package threadpool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Example3 {

public static void main(String[] args) {

    new Example3();

}

public Example3() {

    try {
        testFixedPool(1);
      //testFixedPool(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

public void testFixedPool(int numberOfThreads) throws InterruptedException {

    ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);

    long start = System.currentTimeMillis();

    executor.execute(new TaskPrintInteger(0, 10000));
    executor.execute(new TaskPrintInteger(1, 10000));
    executor.execute(new TaskPrintInteger(2, 10000));
    executor.execute(new TaskPrintInteger(3, 10000));
    executor.execute(new TaskPrintInteger(4, 10000));
    executor.execute(new TaskPrintInteger(5, 10000));
    executor.execute(new TaskPrintInteger(6, 10000));
    executor.execute(new TaskPrintInteger(7, 10000));
    executor.execute(new TaskPrintInteger(8, 10000));
    executor.execute(new TaskPrintInteger(9, 10000));
    executor.shutdown();

    while(!executor.isTerminated()){
    }

    System.out.println();
    System.out.println((System.currentTimeMillis()) - start);
}

private class TaskPrintInteger implements Runnable {

    private int number, times;

    public TaskPrintInteger(int number, int times) {

        this.number = number;
        this.times = times;
    }

    @Override
    public void run() {

        for (int i = 0; i < times; i++) {
            System.out.println(number);
        }

    }

}

}

【问题讨论】:

  • 尝试提交 100000 个任务,而不是 10 个任务。并且不要让他们将内容打印到System.out,因为这是同步的(因此一次只有一个线程在打印,否定了线程的任何优势)。
  • @immibis 这里的关键确实是System.out.println()调用的同步。这一点以及并行处理不会促进任何 I/O 绑定进程的事实。

标签: java multithreading threadpool performance-testing


【解决方案1】:

当您拥有满足的资源时,最佳线程数可以是 1。写入控制台是昂贵的并且是单线程的,因此当您使用多个线程时,您会增加开销,而不是让您的程序更快。线程在独立运行时效果最佳。

【讨论】:

    【解决方案2】:

    您要求许多线程都执行一项活动,这很可能(尽管不保证是)synchronized

    System.out.println(number);
    

    假设你有一个person,你让她在一张纸上写“一”10次,每行一个字。

    现在,您需要在一张纸上各写 10 次“一”和“二”,每行一个字;哪个更快?

    1. 使用您在上面使用的同一个人
    2. 请那个人带朋友写“二”。除了规则是它们从大厅的一端开始,并且都跑到报纸上。第一个到达那里的人,写下他们的话。现在他们跑回大厅的另一端,重复这个过程,直到所有的字都写完。

    我会冒险猜测第一种选择会更快。

    想象一下同样的场景,有 5 个人都尝试写出 10,000 次自己的单词?混乱?是的!

    如果您想从线程中看到真正的改进,任务应该是完全隔离的,没有同步。尤其是没有 IO!

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2019-07-20
      • 2021-09-16
      相关资源
      最近更新 更多