我正在使用ExecutorService
来创建Thread
。在run
方法中,它的处理是一个耗时的操作。它几乎需要10秒才能完成。为了进行测试,我在这里使用Thread.sleep(10000);
我的问题是,如果我使用newFixedThreadPool
as 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个线程是如何并行运行的呢?
发布于 2018-10-11 03:52:57
逻辑CPU的数量决定了在给定时刻运行的线程的数量。
然而,CPU可以每100微秒或大约每秒10,000次切换线程,从而产生一种同时运行更多线程的错觉。调用sleep
可能会导致CPU在超时之前进行上下文切换。
注意: System.out.println持有输出的锁,所以实际上,一次只有一个线程在做实际的工作,即使这样,程序也可能会因为屏幕更新的速度而变慢。尝试删除println
(和sleep
),应该会在很短的时间内完成。
但是所有2000个线程是如何并行运行的呢?
他们几乎都睡着了。唯一忙碌的线程可能是使用缓冲的println
消息更新屏幕的线程。
https://stackoverflow.com/questions/52747720
复制相似问题