线程的等待通知机制


线程的等待和通知机制

对于线程而言,线程的等待通知一般用的是wait()和notify() 方法,但是二者有一些使用的要求,让我们先看一段代码来了解一下!

public class threadtest {
public static void main(String[] args) throws Exception {
    Object o=new Object();
    //设置一个锁对象进行线程的通信使用

    Thread t =new Thread(new Runnable() {//设置一个新线程t使他实现了Runnable
    接口,作为一个匿名的接口实现类对象使用
        @Override//设置线程任务
        public void run() {
            synchronized (o) {//同步代码块
                System.out.println("one");
                System.out.println("two");
                o.notify();//唤醒o的阻塞队列上的线程
                System.out.println("three");
                System.out.println("four");
            }
        }
    });

    t.start();//线程启动
    synchronized (o) {
        System.out.println("1");
        System.out.println("2");
        o.wait();//主线程进入等待状态
        System.out.println("3");
        System.out.println("4");
  	  }
   }
}

结果如下:

1
2
one
two
three
four
3
4

让我们进行一波分析,来好好叨叨两句,不要嫌烦哦哦!

  • 1.首先我们创建了一个Object类的对象o,作为我们要进行锁操作的对象,因为再java 中每一个对象上都有一个对于此对象的阻塞等待队列,就如要想进入我们的密室就要拿出你滴药匙,哇哦,但是很可惜,我们只有一把钥匙,先到先得,得不到的人,你就只能在药匙的队列上等待药匙的出现,哈哈哈。当我们对o进行加锁并进行锁的竞争时,我们便要将那些受此对象锁而不能执行的线程进入此等待队列

  • 2.我们用sychronized()设置同步代码块,因为我们使用o.wait()或者是o.notify()都要放在对o加锁的同步代码块中这样我们才能保证线程的结果是我们可以预料的,因为如果没有同步代码块或者其他方法,我们很难预测果,使用了同步代码块我们可以保证当前线程完整的执行,而不会因为竞争CPU的使用而出现结果的不唯一

  • 3.主线程开始启动进入同步代码块中,打印了1.2,然后调用了o.wait()从而失去了对o 的所标记,从而进入了o的等待队列,然而在此刻,一位大侠线程t,我勒个f去,他来了,t线程见到主线程释放了对o 的锁标记,当机立断,立刻抢到对o的锁标记从而开始迅速执行打印了 one和two,然而t线程这位大侠心存善良,不忍心看到主线程因为进入了o 的等待队列而久久不能继续执行,故t大侠在其线程任务中添o加了o.notify()从而唤醒了o 的等待队列上的主线程

  • 4.but。。。。。但是来了,主线程被唤醒,但是没有得到对o 的锁,仍然不能执行,虽然从o 等待队列中出来,因为没有得到锁,从而进入阻塞状态,等待t大侠线程执行结束,才能将锁还给主线程,让主线程继续执行。,t线程仍然持有对o的所标记,并未释放,所以继续执行打印three和four,结束线程任务

  • 5.主线程得到了锁标记继续执行o.wait()的后续代码,打印了3和4*

    欢迎大家阅读,如有错误,请不吝赐教!!一起进步!!                                    -----HUI
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值