1 //Object 定義了一個引用類型的對象用於加鎖 2 static Object Lock = new Object(); 3 //定義一個int類型變量0作初始值 4 static int iCheck = 0; 5 6 public static void main(String[] args) { 7 //第一個線程 8 int a = 0; 9 //建立一個數組保存打印的數值 10 List<Integer> list = new ArrayList<>(); 11 //設置線程池大小爲4 12 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4); 13 //i從0開始遞增1,直到小於1000跳出循環 14 for (int i = 0; i < 1000; i++) { 15 list.add(a); 16 a++; 17 } 18 //循環觸發4個任務丟給線程池處理 19 for (int i = 0; i < list.size(); i++) { 20 int z = list.get(i); 21 //把任務交給線程池 22 fixedThreadPool.execute(() -> { 23 Test(z); 24 }); 25 } 26 } 27 28 public static void Test(int z) { 29 try { 30 do { 31 //從0開始遞增, 32 if (iCheck == z) { 33 synchronized (Lock) { 34 //輸出線程名稱和當前值 35 System.out.println(Thread.currentThread().getName() + " " + z); 36 iCheck += 1; 37 } 38 break; 39 } 40 //讓出cup時間給其餘知足條件的線程執行 41 Thread.yield(); 42 43 } while (true); 44 //每一個線程休息1秒後繼續工做,4個線程完成循環後第一個線程繼續工做 45 Thread.sleep(1000); 46 } catch (InterruptedException e) { 47 } 48 }
pool-1-thread-1 0
pool-1-thread-2 1
pool-1-thread-3 2
pool-1-thread-4 3
pool-1-thread-1 4
pool-1-thread-3 5
pool-1-thread-4 6
pool-1-thread-2 7
pool-1-thread-1 8數組
打印結果順序輸出spa