中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

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
岐山县| 壶关县| 余江县| 张家口市| 凤山县| 乐至县| 青海省| 遵义市| 永定县| 迁安市| 松潘县| 镶黄旗| 茂名市| 吴忠市| 呼玛县| 宝兴县| 马公市| 通化市| 郸城县| 芒康县| 中西区| 司法| 清苑县| 东乡| 定日县| 临武县| 盐源县| 南召县| 阳东县| 龙江县| 和政县| 吉隆县| 陆丰市| 交口县| 河东区| 阳西县| 海安县| 开远市| 晋江市| 武定县| 建宁县|