首页 > 编程语言 > 详细

线程通信中遇到的问题

时间:2021-05-31 21:41:54      阅读:25      评论:0      收藏:0      [点我收藏+]

通知过早

线程wait()等待后,可以调用notify()唤醒线程,如果notify()唤醒的过早,在wait()等待之前就调用了notify()可能会打乱程序正常的运行逻辑。

所以若notify()通知过早,就不让线程等待了

public class WaitTest {
    static boolean isFirst = true;      //定义静态变量作为是否第一个运行的线程标志
    public static void main(String[] args) {
        final Object lock = new Object();   //定义锁对象
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock){
                    while (isFirst) {
                        try {
                            System.out.println("wait begin");
                            lock.wait();
                            System.out.println("wait end");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("notify begin");
                    lock.notify();
                    System.out.println("notify end");
                    isFirst = false;
                }
            }
        });

//        t2.start();
//        t1.start();  //notify begin  notify end

        t1.start();
        t2.start();
        /*
          wait begin
          notify begin
          notify end
          wait end
         */
    }
}

实际上,调用start()就是告诉线程调度器,当前线程准备就绪,线程调度器在什么时候开启这个线程不确定,即调用start()方法的顺序,并不一定就是线程实际开启的顺序.

线程通信中遇到的问题

原文:https://www.cnblogs.com/silloutte/p/14832277.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!