1. 程式人生 > 實用技巧 >1.2.2 - 案例103:多執行緒 模擬晚餐

1.2.2 - 案例103:多執行緒 模擬晚餐

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();
    }
}