日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 线程交替输出,[java]java经典问题之线程交替打印数字

發布時間:2023/12/19 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 线程交替输出,[java]java经典问题之线程交替打印数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題

給出兩個線程,要求兩個線程交替打印從1到100,例如:A線程打印1,B線程打印2,A線程打印3...依次類推,直到打印到100

思路

這里主要是考察對java中wait/notifyAll機制的理解,可以開啟兩個線程,循環對數字進行自增,同時設置一個標記位,標記A線程是否對數字進行自增和打印,循環監聽該標記位的值,如果已經打印完成,則將A線程置為等待狀態,同時調用notifyAll,通知其它線程喚醒,線程B的操作與線程A相反

代碼實現

public class NumTest {

static Object object = new Object();

static int num = 0;

static volatile boolean aPrint = false;

static class A implements Runnable {

@Override

public void run() {

while (num < 99) {

synchronized (object) {

while (aPrint) {

try {

object.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

num++;

System.out.println(String.format("線程%s打印數字%d", Thread.currentThread().getName(), num));

aPrint = true;

object.notifyAll();

}

}

}

}

static class B implements Runnable {

@Override

public void run() {

while (num < 99) {

synchronized (object) {

while (!aPrint) {

try {

object.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

num++;

System.out.println(String.format("線程%s打印數字%d", Thread.currentThread().getName(), num));

aPrint = false;

object.notifyAll();

}

}

}

}

public static void main(String[] args) {

Thread threadA = new Thread(new A());

threadA.setName("threadA");

Thread threadB = new Thread(new B());

threadB.setName("threadB");

threadA.start();

threadB.start();

}

}

運行結果(部分):

image.png

這里解釋一下為什么while里面的判斷要用 num < 99,我們設想一下當num自增到98時,一定是有一個線程處理wait狀態,此時另一個線程做自增時,num變成了99,隨后執行notifyAll喚醒wait的線程,wait的線程蘇醒后繼續向下執行,再自增一次得到正確結果

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java 线程交替输出,[java]java经典问题之线程交替打印数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。