[英]ExecutorService Java thread limit
我正在使用ExecutorService
创建Thread
。 在run
方法中,其处理耗时的操作。 完成此过程大约需要10秒钟。 为了进行测试,我在这里使用Thread.sleep(10000);
我的问题是,如果我将newFixedThreadPool
用作2000,它将真的一次执行2000个线程吗?
public class ThreadPoolTest {
public static void main(String[] args) {
System.out.println(new Date());
ExecutorService executor = Executors.newFixedThreadPool(2000);
IntStream.range(0, 2000).forEach(
i -> {
Runnable worker = new WorkerThread("WorkerThread-" + i);
executor.submit(worker);//calling execute method of ExecutorService
}
);
executor.shutdown();
while (!executor.isTerminated()) { }
System.out.println("Finished all threads");
System.out.println("Main thread finished");
System.out.println(new Date());
}
}
public class WorkerThread implements Runnable{
private String name;
public WorkerThread(String s){
this.name=s;
}
public void run() {
System.out.println(Thread.currentThread().getName()+" (Start) message = "+name);
processData();
}
private void processData(){
try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); }
}
}
我在这段代码中打印时间。 它表明,仅用了10秒就完成了整个过程。 那意味着所有2000个线程并行执行? 我听说运行的实际线程数将基于系统中的cores
数。 但是所有2000个线程如何并行运行?
逻辑CPU的数量确定在给定时刻运行的线程数。
但是,CPU可以每100微秒或每秒大约10,000次切换线程,从而使幻觉一次运行了更多线程。 调用sleep
可能会导致CPU在超时之前进行上下文切换。
注意:System.out.println为输出保留一个锁,因此实际上,一次只有一个线程在执行实际工作,即使这样,程序也可能因屏幕更新的速度而变慢。 尝试删除println
(和sleep
),它应在短时间内完成。
但是所有2000个线程如何并行运行?
几乎所有人都睡着了。 唯一繁忙的线程可能是使用缓冲的println
消息更新屏幕的线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.