[英]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.