目录
使用wait()和notify可以很好地进行线程间通信,减少CPU资源的浪费
等待通知两个操作可以很好的解决多线程之间的并发执行.比如在饭店做饭,厨师要做好饭端给服务员,然后服务员在端给客人,在厨师正在做菜的过程中服务员就在等待中,等厨师做好菜之后按下铃就通知服务员来取菜.
线程也一样,线程A要进行计算结果,而线程B要利用线程A计算的结果,此时在线程A进行计算时,线程B就在等待,等线程A计算完之后立马通知线程B.两个线程很好地进行了线程间通信.
wait就是进行等待,从运行状态到阻塞状态(WAITING),直到该线程被通知或者中断而停止;
notify方法使对应的wait线程唤醒,从阻塞状态变为运行状态
notifyAll用来唤醒多个线程,将所有呈WAITING状态的线程都进行唤醒
代码演示:
- public static volatile Object locker = new Object();
- public static void main(String[] args) {
- Thread t1 = new Thread(()->{
- synchronized(locker){
- System.out.println("开始等待");
- try {
- locker.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("结束等待");
- }
-
- });
- t1.start();
- Thread t2 = new Thread(()->{
- synchronized(locker){
- System.out.println("请输入一个数字开始通知");
- Scanner scan = new Scanner(System.in);
- scan.nextInt();
- locker.notify();
- System.out.println("通知结束");
- }
- });
- t2.start();
- }
线程饿死指的是线程反复在CPU上运行(但是并没有执行任务),这就导致其他线程没有在CPU上运行,这些线程就被称为线程饿死
而使用wait()和notify就可以很好地去避免.
我们可以让反复在CPU上执行的线程使用wait,让其没有在执行任务时先进行等待,等着他要开始执行任务时,在进行通知notify让它去CPU上进行.