线程(7)--wait()方法、notify()方法、notifyAll()方法

wait()方法:线程阻塞,如果传入了时间参数,阻塞时长到达执行的时间参数值,则自动恢复运行;如果没有传入时间参数,则直到调用该对象的notify或notifyAll方法才能使被该对象阻塞的线程恢复运行
notify()方法: 用于唤醒该对象阻塞的一个线程
notifyAll()方法: 用于唤醒该对象阻塞的所有线程
注意:

  1. 使用这三个方法前,必须同步调用这三个方法的对象
  2. 保证调用wait方法和notify或notifyAll方法的对象是同一个对象

下面用一个案例,来说明wait()方法、notify()方法和 notifyAll()方法的使用
案例说明:
案例一:八戒被妖精迷倒了,被悟空知道了,悟空要让那个妖精把八戒救醒!
案例二:八戒被妖精迷倒了,沙僧也被妖精迷倒了,被悟空知道了,悟空要让那个妖精把八戒和沙僧救醒!

案例一:(代码)分析:在本案例中,八戒需要被妖精迷倒(wait()方法),悟空需要通过妖精让八戒醒来(notify),使用同一个妖精,所以需要创建妖精线程、八戒线程、悟空线程(同步)

  • 创建妖精线程
 package com.wait.entity;
/**
 * @version 2017-12-20 上午10:34:00
 * 妖精类:默认继承object方法
 * wait方法:阻塞线程(施法)
 * notify:释放第一个被wait阻塞的线程
 * notifyAll:释放所有被wait阻塞的线程
 */

public class Ghost extends Thread{
    @Override
    public void run() {
        System.out.println("释放迷药或是解开迷药!");
    }

}
  • 创建八戒线程
package com.wait.entity;
/**
 * @version 2017-12-20 下午3:49:20
 */

public class BaJie extends Thread{

    private Ghost ghost;

    public BaJie(Ghost ghost){
        this.ghost = ghost;
    }

    //重写run()方法
    @Override
    public void run() {
        super.run();
        System.out.println("我(八戒)被妖精迷倒了!");
        //调用wait、notify、notifyAll方法之前,必须先同步对象
        //wait()方法,如果带有时间参数的话,等时间结束,线程自动向下执行。如果没有时间参数,线程一直处于等待当中,直到执行notify方法或是notifyAll方法
        synchronized (ghost) {
            try {
                ghost.wait(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("我(八戒)醒了!");
    }
}
  • 创建悟空线程
package com.wait.entity;
/**
 * @version 2017-12-20 下午4:07:02
 */
public class WuKong extends Thread{
    private Ghost ghost;

    public WuKong(Ghost ghost) {
        super();
        this.ghost = ghost;
    }
    @Override
    public void run() {
        super.run();
        System.out.println("悟空抓住了妖精");
        synchronized (ghost) {
            //案例一使用
            ghost.notify();
            //案例二使用
            ghost.notifyAll();
        }
    }
}
  • 创建测试类
package com.wait.entity;
/**
 * @version 2017-12-20 下午4:10:40
 */

public class TestNotify {
    public static void  main(String args[]){
        //创建妖精对象
        Ghost ghost = new Ghost();
        ghost.start();

        //创建八戒线程
        BaJie bajie  = new BaJie(ghost);
        bajie.start();

        //创建悟空的线程
        WuKong wukong = new WuKong(ghost);
        wukong.start();
    }
}

案例二:在案例一的基础上,加上沙僧类和将TestNotify类,替换成TestNotifyAll类

  • 创建沙僧类
package com.wait.entity;
/**
 * @author 张丹华
 * @version 2017-12-20 下午4:21:42
 */

public class ShaSeng extends Thread{

    private Ghost ghost;


    public ShaSeng(Ghost ghost) {
        super();
        this.ghost = ghost;
    }


    @Override
    public void run() {
        System.out.println("徒儿,快来救师傅!");
        synchronized(ghost){
            try {
                ghost.wait(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } 
        System.out.println("徒儿,我们继续赶路吧!");
    }
}
  • TestNotifyAll类
 package com.wait.entity;
/**
 * @version 2017-12-20 下午4:10:40
 */

public class TestNotify {
    public static void  main(String args[]) throws InterruptedException{
        //创建妖精对象
        Ghost ghost = new Ghost();
        ghost.start();

        //创建八戒线程
        BaJie bajie  = new BaJie(ghost);
        bajie.start();

        //创建沙僧线程
        ShaSeng shaseng = new ShaSeng(ghost);
        shaseng.start();

        Thread.sleep(1000);

        //创建悟空的线程
        WuKong wukong = new WuKong(ghost);
        wukong.start();

    }

}

以上就是我关于wait()方法、notify()方法和notifyAll()方法的理解;如有不懂的地方,欢迎在下面留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值