美文网首页
[java]java经典问题之线程交替打印数字

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

作者: dafasoft | 来源:发表于2021-03-01 17:25 被阅读0次

问题

给出两个线程,要求两个线程交替打印从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经典问题之线程交替打印数字

      本文链接:https://www.haomeiwen.com/subject/zyyafltx.html