多线程通信问题

本文详细介绍了Java中多线程通信的典型场景——生产者-消费者问题。通过实例展示了如何利用wait()和notifyAll()方法实现线程间的同步与通信,避免资源竞争。代码演示中,定义了厨师线程和服务员线程,通过共享对象Food进行交互,确保了线程安全。文章最后总结了多线程通信的关键点。
摘要由CSDN通过智能技术生成


前言

本次文章主要讲解的是多线程的通信问题(生产者与消费者之间的关系)。


提示:以下是本篇文章正文内容,下面案例可供参考

一、运用到的方法

方法描述
wait()作用是释放锁,使其它线程可运行,本次线程进入等待池中,注意需要在synchronized语句块中使用
notifyAll()是将等待池中移走所有等待当前对象的线程并放入锁池中,使他们争夺锁

二、代码演示

代码如下:

/**
 * 这是多线程之间的通信问题(生产者与消费者之间的)
 * 主要定义了两个线程:
 *              1、厨师线程----Cook
 *              2、服务员线程----Writer
 *              一个食物类------Food
 * 如何实现线程之间的通信?
 *              1、定义两个线程的构造方法,其中传入Food f ,在main线程中创建一个Food f 传入
 *              2、定义两个线程的私有成员变量Food f,并且将形参的值赋值给该私有的成员,变量确保他们操作的是同一个对象
 * 如何保证他们通信而不乱?
 *     基本思想:厨师做饭时,服务员睡眠。厨师睡眠,服务员端饭。往复如此
 *     实现思路:
 *              1、将厨师做饭和服务员端饭的方法都加上snychronized关键字,确保只有一个线程在操作(因为此时的锁是this,即是此时的f)
 *              问题:
 *                  但是厨师线程有可能回手掏再次夺取锁获取执行权限?
 *              解决:
 *                  加上一个flag,当为true时厨师线程操作,操作完后flag改为false。
 *                  同理为flase时,服务员线程操作,操作完后flag改为true。
 *                  问题:
 *                      厨师线程可能一直抢到着锁,但由于此时flag为false执行不了,极大的降低了效率
 *                  解决:
 *                      当厨师线程完成操作后,notifyall(唤醒等待池中的所有等待当前对象的线程,进入锁池,因为只有进入锁池才能够获取锁),
 *                      然后执行wait(该方法会释放锁,并且进入等待池),服务员线程也是如此。
 */
public class ThreadTalk {
    public static void main(String[] args) {
        Food f  = new Food();
        new Cook(f).start();
        new Writer(f).start();
    }
}
class Cook extends Thread {
    Food f;
    Cook(Food f){
        this.f = f;
    }
    @Override
    public void run() {
        for (int i=0;i<10;i++){
            if(i%2==0){
                f.getAndSet("老干妈小米粥","香辣味儿");
            }else{
                f.getAndSet("煎饼果子","甜辣味");
            }
        }
    }
}
class Writer extends Thread{
    Food f ;
    Writer(Food f){
        this.f = f;
    }

    @Override
    public void run() {
        for (int i=0;i<10;i++){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            f.getAll();
        }
    }
}
class Food{
    private String name;
    private String taste;
    boolean flag =true;

    public synchronized void getAndSet(String name,String taste){
        if(flag) {
            this.name = name;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.taste = taste;
            flag = false;
        }
        notifyAll();
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void getAll(){
        if(!flag) {
            System.out.println("菜名是:" + name + ",味道是:" + taste);
            flag = true;
        }
        notifyAll();
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

总结

这就是本次的多线程之间的通信问题。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值