Java 线程池吞吐量

标签 java multithreading threadpool performance-testing throughput

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

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

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

Also, the cores can handle up to four simultaneous threads, which improves the performance and resource-utilization of the CPU.

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

public class CpuBoundJob  implements Runnable {

    public void run() {

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

    }
}

最佳答案

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

How 4 processors and 80 threads are completing 80 jobs of 100 milliseconds in one second ?

您的计算机运行的线程比您一直拥有的进程要多得多。操作系统使用调度来停止和开始运行线程(比你看到的要快)来给人一种它们都在同时运行的错觉,但它们不是也不能(如果你想一想就永远不可能)

Also, the cores can handle up to four simultaneous threads, which improves the performance and resource-utilization of the CPU.

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

Does this means 8 threads can run at the same time b 2 cores?

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

关于Java 线程池吞吐量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34707701/

相关文章:

java - 除非添加打印语句,否则线程同步不起作用

c# - 在 Unity 中每 10 帧创建一个新线程是个好主意吗?

C# 主线程被第二个线程使用信号阻塞?

Java:让 ExecutorService 产生可重复的行为?

Java - 在迭代时将元素添加到列表中

java - 鼠标事件在java中随机点击

ruby-on-rails - Ruby Multi threading,我在做什么错?

java多线程-等待可用线程创建和分配下一个任务

java - 我的程序更改了函数内数组的元素,而无需我显式更改它。这是怎么发生的?

java - 存储过程无法从 Hibernate 调用