Java线程池吞吐量

时间:2016-01-10 16:14:04

标签: java multithreading threadpool performance-testing throughput

我在java客户端服务器应用程序中观察到一个非常奇怪的问题。我以每秒80个请求向服务器发送以下Runnable对象。线程池使池大小等于请求率,即池中大约80个线程。我的笔记本电脑是intel Core i5-3230M双核(Windows显示4处理器)。奇怪的是,吞吐量(每秒完成一次)也是80.我无法理解这一点。 4个处理器和80个线程如何在一秒钟内完成80个100毫秒的作业?那就是:

Processors=4
Request rate=80
Thread pool size=80
Each job service time=100milliseconds.
Throughput=80 How?

我原本期望吞吐量= 40,因为每个处理器应该在1秒内大约完成10个作业,因此4个处理器应该提供吞吐量= 40但是它是80?笔记本电脑规范link

  

此外,核心最多可以处理四个并发线程   提高了CPU的性能和资源利用率。

这是否意味着8个线程可以同时运行b 2个核心?

public class CpuBoundJob  implements Runnable {

    public void run() {

     long startTime = System.nanoTime();
         while ((System.nanoTime() - startTime) < (100)*1000000L) {}

    }
}

1 个答案:

答案 0 :(得分:3)

您编写的任务会运行一段固定的时间,而不是一定数量的工作。这意味着无论您拥有多少CPU,它们都应始终以固定的速率完成。你可以让他们睡100个小时。

  

4个处理器和80个线程如何在一秒内完成80个100毫秒的作业?

您的计算机运行的线程比您的进程多得多。操作系统使用调度来停止并开始运行线程(比你看到的更快)给出他们一次运行的错觉,但它们不是也不可能(如果你想的话,永远不可能)

  

此外,内核最多可以处理四个并发线程,从而提高了CPU的性能和资源利用率。

这意味着它的两个内核具有超线程,允许处理器在没有上下文切换的情况下运行多达四个线程(如上所述)

  

这是否意味着8个线程可以同时运行b 2个核心?

提到的i5有2个内核,它支持4个线程。