亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

java怎么實現兩個線程交替打印

小億
110
2023-10-25 21:52:19
欄目: 編程語言

可以使用synchronized關鍵字和wait()、notify()方法來實現兩個線程交替打印。

下面是一個簡單的例子,其中A線程打印奇數,B線程打印偶數。

public class AlternatePrint {
    private int count = 1;
    private final Object lock = new Object();

    public static void main(String[] args) {
        AlternatePrint alternatePrint = new AlternatePrint();
        Thread threadA = new Thread(() -> alternatePrint.printOdd());
        Thread threadB = new Thread(() -> alternatePrint.printEven());
        threadA.start();
        threadB.start();
    }

    public void printOdd() {
        while (count <= 100) {
            synchronized (lock) {
                if (count % 2 != 0) {
                    System.out.println(Thread.currentThread().getName() + ": " + count);
                    count++;
                    lock.notify(); // 喚醒等待的線程
                } else {
                    try {
                        lock.wait(); // 當前線程等待
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public void printEven() {
        while (count <= 100) {
            synchronized (lock) {
                if (count % 2 == 0) {
                    System.out.println(Thread.currentThread().getName() + ": " + count);
                    count++;
                    lock.notify(); // 喚醒等待的線程
                } else {
                    try {
                        lock.wait(); // 當前線程等待
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

在上面的例子中,使用一個共享的lock對象作為鎖,每個線程通過synchronized(lock)來獲取鎖對象。當count為奇數時,A線程打印并增加count,然后調用lock.notify()方法喚醒正在等待的B線程。當count為偶數時,B線程打印并增加count,然后調用lock.notify()方法喚醒正在等待的A線程。如果count的值不符合當前線程的打印條件時,當前線程調用lock.wait()方法進入等待狀態,直到被喚醒。

需要注意的是,lock.wait()和lock.notify()方法只能在synchronized塊中調用,否則會拋出IllegalMonitorStateException異常。同時,線程的啟動順序不確定,所以A和B線程的打印順序可能會有不同。

0
涡阳县| 临海市| 大冶市| 萝北县| 邹城市| 云阳县| 灵宝市| 永修县| 石楼县| 遵义市| 平阴县| 平顺县| 桃源县| 河间市| 浦北县| 探索| 汶上县| 黔西县| 云和县| 安龙县| 南涧| 云霄县| 黄石市| 大悟县| 丹巴县| 花莲市| 敦化市| 彭泽县| 南陵县| 大同市| 彩票| 鹤庆县| 泸溪县| 竹溪县| 汝阳县| 芜湖县| 承德县| 阳西县| 南城县| 威宁| 华容县|