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

}

}

运行结果(部分):

8636ad64c89f

image.png

这里解释一下为什么while里面的判断要用 num < 99,我们设想一下当num自增到98时,一定是有一个线程处理wait状态,此时另一个线程做自增时,num变成了99,随后执行notifyAll唤醒wait的线程,wait的线程苏醒后继续向下执行,再自增一次得到正确结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值