1.2.2 - 案例103:多執行緒 模擬晚餐
阿新 • • 發佈:2020-11-24
Java:典例Coding 1.2.2 - 多執行緒
模擬晚餐(CountDownLatch類)
要求實現(次序隨機):
小紅在吃第1個餃子
小紅在吃第2個餃子
小紅在吃第3個餃子
小紅在吃第4個餃子
小明在吃第1個餃子
小明在吃第2個餃子
小明在吃第3個餃子
小明在吃第4個餃子
小明在吃第5個餃子
小剛在吃第1個餃子
小剛在吃第2個餃子
小剛在吃第3個餃子
小剛在吃第4個餃子
小剛在吃第5個餃子
小紅在吃第5個餃子
媽媽在收拾碗筷
import java.util.concurrent.CountDownLatch; public class CountDownLatchTest { public static void main(String[] args) { // 建立CountDownLatch的物件,傳遞給四個執行緒。 // 底層定義一個計數器,此時計數器的值為3 CountDownLatch countDownLatch = new CountDownLatch(3); // 媽媽執行緒+三個孩子執行緒,建立並開啟 MotherThread motherThread = new MotherThread(countDownLatch); motherThread.start(); ChileThread1 t1 = new ChileThread1(countDownLatch); t1.setName("小明"); ChileThread2 t2 = new ChileThread2(countDownLatch); t2.setName("小紅"); ChileThread3 t3 = new ChileThread3(countDownLatch); t3.setName("小剛"); t1.start(); t2.start(); t3.start(); } } class MotherThread extends Thread { private CountDownLatch countDownLatch; public MotherThread(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { // 等待 // 當計數器變成0的時候,會自動喚醒這裡等待的執行緒。 try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } // 喚醒後:收拾碗筷 System.out.println("媽媽在收拾碗筷"); } } class ChileThread1 extends Thread { private CountDownLatch countDownLatch; public ChileThread1(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { for (int i = 1; i <= 5; i++) { System.out.println(getName() + "在吃第" + i + "個餃子"); } // 吃完說一聲 // 每一次countDown方法的時候,就讓計數器-1 countDownLatch.countDown(); } } class ChileThread2 extends Thread { private CountDownLatch countDownLatch; public ChileThread2(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { for (int i = 1; i <= 5; i++) { System.out.println(getName() + "在吃第" + i + "個餃子"); } countDownLatch.countDown(); } } class ChileThread3 extends Thread { private CountDownLatch countDownLatch; public ChileThread3(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { for (int i = 1; i <= 5; i++) { System.out.println(getName() + "在吃第" + i + "個餃子"); } countDownLatch.countDown(); } }