线程通知与等待

wait方法

  一个线程调用一个共享变量的wait()方法时,该线程会被阻塞挂起。调用wait的前提是该线程有获取共享变量的监视器锁。
  获取监视器锁:
(1)synchronize(共享变量){

}
(2)在在共享变量的方法前加synchronize关键字,调用该方法。
若线程没有获取监视器锁而调用了wait()则会抛出IllegalMonitorStateException异常。

停止线程阻塞并返回:
(1)其他线程调用共享对象的notify和notifyAll方法
(2)其他线程调用该线程的interrupt方法,该线程会抛出InterruptedException异常。

  wait带参数方法:
wait(long timeout):线程调用该方法挂起后如果没有在timeout ms时间内被其他线程唤醒会因为超时而返回。如果参数为负数则会抛出异常。
wait(long timeout, int nanos):当nanos大于0时使timeout递增1.

  虚假唤醒:(1)一个线程有可能在没有被其他线程用notify、notifyAll唤醒的情况下被唤醒,(2)被中断,(3)等待超时
避免虚假唤醒:

synchronized(obj){
        while(条件不满足){
            obj.wait();
        }
}

notify()方法和notifyAll()方法

  当一个线程调用共享对象的notify()方法后会随机唤醒一个在该共享变量上因调用wait方法被挂起的线程。而notifyAll()则是唤醒所有符合上诉条件的线程。
  注意,两个方法都不能保证被唤醒的线程一定会直接执行,只是使被唤醒的线程竞争锁。由于被唤醒的线程需要竞争监视器锁,当获取到该锁以后才能继续执行,所有被唤醒的线程并不会立刻从wait方法返回,而是当获取到共享变量的监视器锁以后再返回。

join()方法

  在一个线程内调用另一个线程的join()方法后,主线程会阻塞,等待子线程执行完毕后再继续执行,当然,在调用join()方法前,子线程需要先start()启动。

sleep()方法

  sleep是一个静态方法,调用Thread.sleep()方法时,使当前线程休眠一定的时间后参与CPU调度。sleep方法只会让出CPU资源并不会释放锁等监视器资源。
  sleep与wait的区别在于,调用wait后线程进入阻塞态并释放锁资源,而sleep不会。所以调用wait需要获取共享变量的锁,而sleep则不用。

yield()方法

  yield方法也是一个静态方法,调用yield方法是使当前进程让出CPU进入就绪态,使线程调度器进入下一轮的线程调度。由于让出CPU的线程是进入就绪态,所以有可能会再次被分配到CPU资源继续执行。
  yield与sleep区别是调用yield后线程进入就绪态,而sleep进入阻塞态。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值