簡體   English   中英

ExecutorService Java線程限制

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM