• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

关于多线程的问题 麻烦各位大佬进来看看 指导指导 十分感谢

问题: Baozipu类和Chihuo类都创建了Baozi的对象为什么main方法还要传个Baozi的对象参数进去呢?这里有点不解 难道是因为锁?package cn.XianCheng;public class Baozipu extends Thread{    //创建一个包子类型的变量        Baozi bz = new Baozi();    //使用带参构造方法为这个包子赋值    public Baozipu(Baozi cz){        this.bz = cz ;    }    //设置线程任务生产包子    @Override    public void run() {            while(true){    //必须使用同步技术保证只有一个线程在执行  这里用 同步代码块        synchronized(bz){        //判断有没有包子            if(bz.flag==true){             //有包子包子铺就进入等待状态                bz.notify();                try {                    bz.wait();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            if(bz.flag==false){            //没有包子就生产包子               bz.pi = "薄皮";               bz.xian = "牛肉馅";                System.out.println("正在生产包子"+Thread.currentThread().getName());                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                bz.flag = true;                System.out.println("包子铺已经生产好了:"+bz.pi+bz.xian+"包子"+Thread.currentThread().getName());                bz.notify();                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }       }    }}-------------------------------------------------------------------------------------------------------------
package cn.XianCheng;public class Chihuo extends Thread{        Baozi bz = new Baozi();        public Chihuo(Baozi cz){            this.bz = cz ;        }    @Override    public void run() {        while(true){            synchronized (bz){                if(bz.flag == false){                    bz.notify();                    try {                        bz.wait();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }                if(bz.flag == true){                    System.out.println("正在吃:"+bz.pi+bz.xian+"包子"+Thread.currentThread().getName());                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    bz.flag = false ;                    System.out.println("吃完了"+Thread.currentThread().getName());                    System.out.println("-------------------------------------");                    bz.notify();                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }    }}--------------------------------------------------------------------------------------------------
package cn.XianCheng;public class Baozi {    //皮    //馅    //包子的状态     String pi;     String xian;     boolean flag = false;}--------------------------------------------------------------------------------------------------
package cn.XianCheng;public class XianChengmain {        public static void main(String[] args) {            Baozi cz = new Baozi();//创建包子对象            new Baozipu(cz).start();//开启包子铺线程            new Chihuo(cz).start();//开启吃货线程    }}

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

全部参与1

多线程执行(由线程调度器管理)是无序交替(无规律)。正常逻辑包子铺生产,吃货类消费,它们所用的是同一批包子。你现在的代码就好像,包子铺,吃货有各自的包子,但都只对第三方(主线程)运过来(new)的包子感兴趣。三个线程地位相等,然后抢着执行(线程启动顺序不代表执行顺序)。为确保成功消费包子,需要明确各线程执行体得到的结果有序,即生产(包子铺)包子 -> 运输(主线程)->消费(吃货)。因此需要线程通信协调,让各线程执行流有序,有了锁解决资源共享能不能用的问题,有了同步解决数据一致性问题,三个线程的通信也依赖于那个主线程包子实例,实例notify与wait方法则告诉其它线程该对象锁是否解除,当前线程是否需要阻塞,来控制线程间执行流。换而言之,如果你不传包子对象,相当于两个子线程,各自玩自家的包子,与主线程包子无关,那也没必要用到锁,用到同步,更不需要多线程了。

使用道具 举报

发新帖

发布任务需求已有1031166位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!