Thread

2019-10-17

sleep

sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;

wait

wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态
notifyAll调用后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行,如果不成功则留在锁池等待锁被释放后再次参与竞争。而notify只会唤醒一个线程

uasge

  1. 永远在synchronized的函数或对象里使用wait、notify和notifyAll,不然Java虚拟机会生成 IllegalMonitorStateException。

  2. 永远在while循环里而不是if语句下使用wait。这样,循环会在线程睡眠前后都检查wait的条件,并在条件实际上并未改变的情况下处理唤醒通知。

  3. 永远在多线程间共享的对象(在生产者消费者模型里即缓冲区队列)上使用wait。

  4. 更倾向用 notifyAll(),而不是 notify()。

kill

使用Thread提供的interrupt()方法,因为该方法虽然不会中断一个正在运行的线程,但是它可以使一个被阻塞的线程抛出一个中断异常,从而使线程提前结束阻塞状态,退出堵塞代码

通信

进程通信

  • 管道
  • 消息队列
  • 共享内存
  • 发信号
  • 信号量
  • 套接字

线程通信

  • 信号量
  • signal
  • 全局变量共享
  • 阻塞唤醒

你可能感兴趣的:(Thread)