美文网首页JAVA经典问题
生产者消费者问题

生产者消费者问题

作者: 石乐志的LK | 来源:发表于2017-09-27 08:04 被阅读0次

参照马士兵老师的视频
但是在我按照他的方法实现的时候出现一个问题,就是还没生产出3号馒头就已经被吃掉了,后来仔细分析是因为打印生产和消费馒头的语句放的有问题,因为在run方法中,没有线程同步,所以虽然已经生产了一个,但是没打印出来就去消费了,然后打印消费的,再回来这个线程打印生产的,所以这样会产生问题。我的解决方法是把生产和消费的打印语句放在Basket的push和pop中,因为他们是线程同步的,生产或者消费的时候一定会打印出来再进行线程的切换...

package cn.lk.java.test;
class ManTou{
    public int id;
    public ManTou(int id) {
        this.id = id;
    }
    
    public String toString() {
        return "" + id;
    }
    
}

class Basket {
    int index = 0;
    ManTou[] arry = new ManTou[6];
    
    public synchronized void push(ManTou m) {
        while(index == arry.length) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notify();
        arry[index] = m;
        index ++;
        System.out.println("======生产者生产了馒头" + m);
    }
    public synchronized ManTou pop() {
        while(index == 0) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notify();
        index --;
        ManTou m = arry[index];
        System.out.println("消费者消费了馒头" + m);
        return m;
    }
}
class Producer implements Runnable{
    Basket bb = null;

    public Producer(Basket bb) {
        this.bb = bb;
    }

    @Override
    public void run() {
        for(int i = 1; i <= 20; i++) {
            ManTou m = new ManTou(i);
            bb.push(m);
//          try {
//              Thread.sleep(1000);
//          } catch (InterruptedException e) {
//              e.printStackTrace();
//          }//生产出来一个就要让出线程给消费的线程去执行,出来的结果是生产一个消费一个
        }
    }
}

class Consumer implements Runnable{
    Basket bb = null;

    public Consumer(Basket bb) {
        this.bb = bb;
    }

    @Override
    public void run() {
        for(int i = 1; i <= 20; i++) {
            ManTou m = bb.pop();
//          try {
//              Thread.sleep(1000);
//          } catch (InterruptedException e) {
//              e.printStackTrace();//同上
//          }
        }
    }
}
public class ProducerConsumer {

    public static void main(String[] args) {
        Basket bb = new Basket();
        Producer chief1 = new Producer(bb);
        Consumer customer1 = new Consumer(bb);
        
        Thread t1 = new Thread(chief1);
        Thread t2 = new Thread(customer1);
        
        t1.start();
        t2.start();
    }
}

相关文章

  • 生产者和消费者问题

    生产者和消费者问题 问题简述 组成 系统中有一组生产者和消费者进程 生产者生产者将产品放入缓冲区 消费者消费者进程...

  • 操作系统知识点持续更新

    生产者消费者问题 关于生产者消费者问题可以参考这篇文章:生产者消费者问题的java实现 临界区与互斥量 临界区:保...

  • 经典同步互斥问题

    生产者消费者问题 生产者消费者应当是最最基本的同步互斥问题了。生产者生产了之后消费者才消费,消费者消费之后,通知生...

  • 生产者和消费者问题详解

    生产者和消费者问题详解 定义 生产者消费者问题(英语:Producer-consumer problem),也称有...

  • 2-1.死锁-经典同步问题

    三、经典同步问题 1.生产者-消费者问题 计算机系统中的许多问题都可归结为生产者与消费者问题,生产者与消费者可以通...

  • 9. python多进程之Queue实现生产者消费者模型

    一、概述 什么是生产者消费者模式生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此...

  • 生产者消费者

    什么是生产者和消费者 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。 生产者和消费者彼此之间不直...

  • java生产者消费者实现

    什么是生产者消费者模式 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直...

  • 生产者消费者模式-java原生、Disruptor实现方案

    生产者消费者模式介绍 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接...

  • Java实现生产者-消费者模型的几种方法

    什么是生产者消费者模式 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直...

网友评论

    本文标题:生产者消费者问题

    本文链接:https://www.haomeiwen.com/subject/gseyextx.html