我在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) {}
}
}
答案 0 :(得分:3)
您编写的任务会运行一段固定的时间,而不是一定数量的工作。这意味着无论您拥有多少CPU,它们都应始终以固定的速率完成。你可以让他们睡100个小时。
4个处理器和80个线程如何在一秒内完成80个100毫秒的作业?
您的计算机运行的线程比您的进程多得多。操作系统使用调度来停止并开始运行线程(比你看到的更快)给出他们一次运行的错觉,但它们不是也不可能(如果你想的话,永远不可能)
此外,内核最多可以处理四个并发线程,从而提高了CPU的性能和资源利用率。
这意味着它的两个内核具有超线程,允许处理器在没有上下文切换的情况下运行多达四个线程(如上所述)
这是否意味着8个线程可以同时运行b 2个核心?
提到的i5
有2个内核,它支持4个线程。