为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

Dusdii 2019-05-16 11:19:12
问题: 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 回答

?
pardon110

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

查看完整回答
反对 回复 2019-05-20

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信