多线程的wait notify notifyall sleep stop interrupt join
wait notify
wait notify 都是object根类上的方法(貌似现在不太常用)
wait调用之前
wait方法调用之前要先获得该对象的监视器锁,否则会报IllegalMonitorStateException异常
获得监视器锁的方式主要有
- Synchronized(Object)
- synchronized void dosomething(){}
wait调用后
线程调用共享对象上的wait()后会被阻塞,此线程就进入到此对象的等待对列中,此时线程释放此对象的监视器锁
wait被打断
线程wait sleep yield 被阻塞时,会抛出InterruptedException
唤醒以及notify notifyall的区别
notify就是随机唤醒一个在此对象上等待/被阻塞 的线程
notifyall唤醒所有此对象等待队列上的线程,竞争一个此锁
sleep(long ms)
让调用它的线程休眠一段时间 ,同样被中断也会抛出InterruptedException,但是与wait()不同是此线程不会让出监视器资源,不会释放锁。
stop()
强行中断此线程,但是容易带来线程安全问题,属于被抛弃的方法
interrupt()
与stop()方法不同的是,interrupt()方法并不会强制中断此线程,而是设置一个中断标记,与之配套的isinterrupted()方法则会去判断是否有中断标记,通过
if(Thread.currentedThread().isinterrupted()){
break;
}
或者
while(!Thread.currentedThread().isinterrupted()){
do thread job…}
等方法退出这个线程。
isinterrupted()与interrupted()的区别
interrupted()判断的当前线程的中断情况 同时会清除中断标记
isinterrupted()判断的是调用它的线程的中断情况
join()
调用它的线程会被阻塞,直到join对应的线程结束。例如
public static void main(String []args){
threada.join();
threadb.join();
System.out.println(“main”);
}
main线程调用threada.join();随后被阻塞,直到thread跑完;