while循環+線程池

public class VolatileTest2 {

    private static volatile int ticket = 10;
    public static void main(String[] args) throws InterruptedException {

        ExecutorService executorService = Executors.newFixedThreadPool(5);

        while (ticket > 0) {
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":" + ticket--);
                }
            });

        }
        executorService.shutdown();
        //Thread.sleep(100);
    }
}

自己寫了這樣一段代碼,本來以爲線程池只會執行十次,結果發現最後的ticket都出現負數了。經過仔細的分析發現:

首先第一次當ticket等於10時,進入while循環,將一個任務(注意這個任務有個sleep方法)交給線程池,此時線程池裏面的任務因爲有sleep方法,還未能執行到ticket--,因此ticket仍然是10,繼續執行上述邏輯。也就是說從10變成9過程這段時間中,已經有很多個任務被扔到了線程池中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章