线程间通讯:
多个线程在处理同一资源,但是人物却不同。
等待/唤醒机制
涉及的方法:
1.wait(); 让线程处于冻结状态,被wait的线程会被存储到线程池中。
2.notify();唤醒线程池中的一个线程(任意)。
3.notifyaAll();唤醒线程池中的所有线程。
这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法。
必须要明确操作的是哪个锁上的线程。
为什么操作线程的方法 wait notify notifyAll 定义在了Object类中??
因为这些方法是监视器的方法,监视器其实就是锁。
锁可以是任意的对象,任意的对象调用的方式一定定义在Object类中。
同步代码块对于锁的操作是隐式的。
Lock接口:替代了同步代码块或者同步函数,将同步的隐式锁操作变成现实锁操作。
同时更为灵活,可以一个锁上加多组监视器。
lock();获取锁
unlock();释放锁,通常需要定义在finally代码块中。
Condition接口:出现代替了Object中的wait,notify,notifyAll方法。
将这些监视器方法单独进行了封装,变成Condition监视器对象。
可以任意锁进行组合。
await();
signal();
signalAll();
wait 和 sleep 区别?
1.wait可以指定时间也可以不指定,sleep必须指定时间。
2.在同步中时,对CPU的执行权和锁的处理不同。
wait:释放执行权,释放锁。
sleep:释放执行权,不释放锁。
停止线程:
1.stop方法
不安全,已过时。
2.run方法结束
可以使用interrupt()方法可以将线程从冻结状态强制恢复到运行状态中来,让线程具备CPU的执行资格。
当时强制动作会发生InterruptedException,需要处理