多线程之线程的交互

今天学习了线程的交互,什么叫线程交互?如何交互?
线程交互:通俗的说就是线程之间的交互通知。
如何交互:这里使用notify(),wait()。
notify(),是线程唤醒正在等待的当前这个同步对象的线程。
wait(), 是线程等待,同时暂时释放正在占有的对象。(注意”占有“,是不是很熟悉,表示它是和线程同步一起的)。

列子:有两个线程,处理同一个英雄。一个加血,一个减血。
减血的线程,发现血量<=1,就停止减血,直到加血的线程为英雄加了血>=10,才可以继续减血。

hero.java代码:

public class Hero {
    private StringBuffer name;  //人物姓名
    private float hp;       //生命值
    private int damage;   //伤害值

    public Hero(StringBuffer name, float hp, int damage) {
        this.name = name;
        this.hp = hp;
        this.damage = damage;
    }

    public Hero() { }
    public StringBuffer getName() {
        return name;
    }
    public float getHp() {
        return hp;
    }
    public int getDamage() {
        return damage;
    }

/*使用synchronized 进行修饰,表示方法是线程安全*/
    //加血
    public synchronized  void recovery() {
        if(hp>=10){
            System.out.println("补充完毕!");
            System.out.printf("recovery:当前hero:%s,hp值为%.0f%n", name, hp);
            // 通知那些等待在this对象上的线程,可以醒过来了
            this.notify();
        }
        else {
            this.hp =this. hp + 2;
        }

    }

   //攻击,减血
    public synchronized  void attack() {
        if (hp<=1){
            System.out.println("hp值 已经不足,请补充");
            try {
                //当hp值小于等于 1 时,等待。
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
       this.hp = this.hp -3;
        System.out.printf("attack:当前hero:%s,hp值为%.0f%n", name, hp);
    }

}

TestThread.java 代码:

public class WaitAndNotify {
    public static void main(String[] args) {
        final Hero h1 = new Hero(new StringBuffer("达摩"), 18.0f, 150);

        Thread t1 = new Thread(){
            public  void run(){
                while(true){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //减血
                    h1.attack();
                }
            }
        };
        t1.start();

        Thread t2 = new Thread(){
            public  void run(){
                while(true){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //加血
                   h1.recovery();
                }
            }
        };
        t2.start();

    }
}

结果:
在s这里插入图片描述

以上就是写的代码了,里面最主要的是 wait(),notify()。wait()线程暂时释放对象,进行等待,notify()进行唤醒正在等待的当前这个同步对象的线程。

补充:
关于notify()与notifyAll():
1,其实wait(),notify()不是Tread里面的方法,他们来自于Object。所有的对象(Object)都可以被称为同步对象,所以也可以说它们是同步对像上的方法。
2,notify(),是提醒或者说是唤醒 当前占有该同步对象的线程,notifyAll()是唤醒 当前占有该同步对象的所有线程 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习是一种人工智能(AI)的子领域,致力于研究如何利用数据和算法让计算机系统具备学习能力,从而能够自动地完成特定任务或者改进自身性能。机器学习的核心思想是让计算机系统通过学习数据中的模式和规律来实现目标,而不需要显式地编程。 机器学习应用非常广泛,包括但不限于以下领域: 图像识别和计算机视觉: 机器学习在图像识别、目标检测、人脸识别、图像分割等方面有着广泛的应用。例如,通过深度学习技术,可以训练神经网络来识别图像中的对象、人脸或者场景,用于智能监控、自动驾驶、医学影像分析等领域。 自然语言处理: 机器学习在自然语言处理领域有着重要的应用,包括文本分类、情感分析、机器翻译、语音识别等。例如,通过深度学习模型,可以训练神经网络来理解和生成自然语言,用于智能客服、智能助手、机器翻译等场景。 推荐系统: 推荐系统利用机器学习算法分析用户的行为和偏好,为用户推荐个性化的产品或服务。例如,电商网站可以利用机器学习算法分析用户的购买历史和浏览行为,向用户推荐感兴趣的商品。 预测和预测分析: 机器学习可以用于预测未来事件的发生概率或者趋势。例如,金融领域可以利用机器学习算法进行股票价格预测、信用评分、欺诈检测等。 医疗诊断和生物信息学: 机器学习在医疗诊断、药物研发、基因组学等领域有着重要的应用。例如,可以利用机器学习算法分析医学影像数据进行疾病诊断,或者利用机器学习算法分析基因数据进行疾病风险预测。 智能交通和物联网: 机器学习可以应用于智能交通系统、智能城市管理和物联网等领域。例如,可以利用机器学习算法分析交通数据优化交通流量,或者利用机器学习算法分析传感器数据监测设备状态。 以上仅是机器学习应用的一部分,随着机器学习技术的不断发展和应用场景的不断拓展,机器学习在各个领域都有着重要的应用价值,并且正在改变我们的生活和工作方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值