wait()
线程调用一个共享变量的wait()方法时,该线程会阻塞。
当发生以下事件之一才会返回:
1.其他线程调用了该共享对象的noify()或者noifyAll()方法。
2.其他线程调用了该线程的interrupt()方法。
监视器锁
synchronized 修饰变量或者方法
虚假唤醒
防范方法:被唤醒时检查是否能被唤醒,不能则继续等待
调用共享变量的wait()方法只会释放当前变量的锁,不会释放其他变量的锁
notify()唤醒一个调用该变量的wait()方法挂起的线程,随机唤醒
notufyAll()唤醒所有调用该变量的wait()方法挂起的线程
join() 等待线程执行终止
当前线程等待调用join方法的线程执行完毕后再执行
CountDownLatch是更优的选择
sleep() 让出cpu,但是不让监视器锁
yield() 让出cpu 重新进入就绪队列
interrupt() 可以将运行中的线程的状态设置为中断,但不会直接终止。
阻塞的线程被调用此方法时会报错。
isInterrupted() 检测当前线程是否中断、不清除中断标志
interrupted() 检测当前线程(可以通过任何线程调用)是否中断 、静态方法、清除中断标志
可以捕获被阻塞的线程的异常中断以达到终止线程的目的
线程上下文切换的时机:
1.时间片使用完,处于就绪状态
2.当前线程被其他线程中断
避免死锁:
1.申请资源的有序性
守护线程与用户线程
最后一个非守护线程结束时,jvm会正常退出
设置为守护线程: setDaemon(true)