线程池性能

时间:2014-09-27 11:54:02

标签: java multithreading threadpool performance-testing

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

首先,我将池中的线程数设置为1,大约需要920毫秒,然后我将池中的线程数更改为2(和3,4,5,6,7 ......)它花了1200毫秒,当线程同时运行时不应该更快吗?

当我将其更改为缓存的线程池时,它也需要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);
        }

    }

}

}

2 个答案:

答案 0 :(得分:5)

你要求很多线程都进行一项活动,这很可能(虽然不能保证)synchronized

System.out.println(number);

让我们假设您有一个person,并且要求她写一个&#34;一个&#34;在一张纸上10次,每行一个字。

现在,你需要写一个&#34;一个&#34;和&#34;两个&#34;在一张纸上每次10次,每行一个字;哪个更快?

  1. 使用上面使用的同一个人
  2. 要求那个人带朋友写两个&#34; s。除了规则是他们从一个大厅的一端开始,然后两个都跑到报纸上。首先到达那里的人,写下他们的话。现在他们跑回到大厅的另一端,重复这个过程,直到写完所有的单词。
  3. 我猜想第一种选择会更快。

    想象一下同样的场景,5个人都试图写出他们的单词10,000次?混沌?是的!

    如果您希望从线程中看到真正的改进,那么任务应该完全隔离而不需要同步。特别是没有IO!

答案 1 :(得分:1)

当你有一个满足的资源时,最佳线程数可以是1.写入控制台是昂贵的和单线程的,所以当你使用多个线程时,你增加了开销,而不是让你的程序更快。线程在独立运行时效果最佳。