java多线程之间通信的几种方式:
Thread提供的suspend()和resume()方法(已弃用-了解一下):
提供挂起线程的功能,但是由于挂起不释放锁。在对象锁的执行代码块内容易造成死锁。
suspend必须先于resume执行,否则也会造成死锁。
Object类提供的wait()/notify()/notifyAll()方法:
只能在对象锁持有者线程内调用(同步控制方法内调用),否则会抛出IllegalMonitorStateException异常。
wait方法使当前线程等待,加入对象的等待集合中去,自动释放对象锁。
notify/notifyAll:唤醒一个或所有等待线程。
顺序调用要求:wait必须先于notify调用,否则会使线程一直出去waiting状态。
juc包下的park()/unpark()机制:
part相当与等待许可,unpark为提供许可。因此没有调用顺序的要求。
多次调用unpark后在调用park,线程执行。多次unpart无法叠加。第一个park线程执行。后面的park线程等待,
需要在调用unpark唤醒线程。
线程中断:stop、共享变量、Thread的interrupt方法
stop:已弃用,强制停止线程,抛弃所有锁,可能会导致代码逻辑问题。
共享变量:通过控制共享变量控制线程。
interrupt:将线程的中断状态设置为true。
线程之间等待:
线程A调用线程B的join方法,那么线程A就要等到线程B执行完成后在继续执行。