Java 多线程 生产者与消费者问题测试代码

By | 06月09日
Advertisement
public class ConsumerAndProducer{
    public static void main(String[] args){
            Box box=new Box();
            Producer p=new Producer(box);
            Consumer c=new Consumer(box);
            new Thread(p).start();
            new Thread(c).start();

    }
}

class Food{
    int id;
    Food(int id){
        this.id=id;
    }

    public String toString(){
        return "Food : " + this.id;
    }
}

class Box{
    int index = 0;
    Food[] arrFood = new Food[6];

    public synchronized void put(Food food){
        while(index==arrFood.length){
            try{
                this.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        this.notifyAll();
        arrFood[index++]=food;
    }

    public synchronized Food get(){
        while(index==0){
            try{
                this.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        this.notifyAll();
        return arrFood[--index];
    }

}

class Producer implements Runnable{

    Box box=null;

    Producer(Box box){
        this.box=box;
    }

    public void run(){
        for(int i=0;i<20;i++){
            Food food = new Food(i);
            System.out.println("Put : " + food);
            box.put(food);
            try{
                Thread.sleep((int)(Math.random()*100));
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

class Consumer implements Runnable{

    Box box=null;

    Consumer(Box box){
        this.box=box;
    }

    public void run(){
        for(int i=0;i<20;i++){
            Food food=box.get();
            System.out.println("Get : " + food);
            try{
                Thread.sleep((int)(Math.random()*200));
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

Similar Posts:

  • Java 多线程 生产者和消费者

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * 生产者和消费者 * * 请考虑这样一个饭店,它有一个厨师和一个服务员.这个服务员必须等待厨师准备好膳食.当厨师准备好时,他会通知服务员, * 之后服务员上菜,然后返回继续等待.这是一个任务协作的示例:厨师代表生产者,而服务员代表消费者.两个任务

  • java多线程 生产者与消费者

    编写程序时出现的问题1.直接在consummer thread and product thread 中产生consume的实例对象,那就产生了两个实例对象consume A and B,Thread(pro).start()调用的是A.put(),而Thread(consummer).start()调用的是B.get(),因此产生了不同步,可以采用构造函数让他们调用同一个实例对象.2.生产者不停存放,消费者不停消费,因此要有while()循环.3.设置进入等待的条件标志 boolean nop

  • 多线程——生产者和消费者的问题

    生产者和消费者问题的产生 生产者和消费者是指俩个不同的线程对象,操作统一资源的情况:生产者负责生产数据,消费者负责消费数据,生产者每生产完一组数据后,消费者 消费一组数据, Object对多线程的支持: wait();等待被唤醒 notify();唤醒 notifyAll();唤醒所有 sleep()和wait()的区别: sleep()属于Thread类,类似于一个闹钟,只持续一定时间.wait()属于Object类,需要被notify()唤醒,如果不唤醒就会一直等待下去 具体案例如下: /*

  • Java多线程 生产者消费者问题 (2)

    一个使用了队列的通用实现: http://blog.csdn.net/chaosllgao/archive/2009/05/23/4211183.aspx 此文描述了一种更简单的模型 1. 同时只有1个生产者和1个消费者 2. 不用队列,同时只有一个产品 3. 生产者每次生产1个0到100之间的随机数,消费者则把该随机数打印出来.如果产生的随机数为0,则生产者.消费者均退出运行 import java.util.Random; public class ProducerConsumer { pu

  • 2015阿里巴巴校招附加题:多线程-生产者和消费者

    今天参加了阿里2015校招实习生的笔试. 选择题部分确实有水平,由于基础一般再加上没做准备,打得一塌糊涂,目测已经阵亡了,不过附加题的最后一个还是很基础的,关于java的多线程中的生产者和消费者的问题,在此感谢@绝影. 题目: 有个篮子,一个人不停地往里面放苹果,另一个不停地从里面拿出来苹果,篮子最多能放5个苹果,苹果数量无限.用Java模拟实现. 实现过程: 主类: class ProducerConsumer { public static void main(String[] args)

  • [置顶] c#多线程 生产者和消费者

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待.在C#中,关键字lock定义如下: lock(expression) statement_block   expression代表你希望跟踪

  • java 多线程-锁详解及示例代码

    自 Java 5 开始,java.util.concurrent.locks 包中包含了一些锁的实现,因此你不用去实现自己的锁了.但是你仍然需要去了解怎样使用这些锁. 一个简单的锁 让我们从 java 中的一个同步块开始: public class Counter{ private int count = 0; public int inc(){ synchronized(this){ return ++count; } } } 可以看到在 inc()方法中有一个 synchronized(th

  • 经典多线程Java实例 生产者与消费者

    生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.在同一个进程地址空间内执行的两个线程.生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 代码如下: Producer.java 生产者 p

  • Java多线程生产者/消费者模式(二)

    4:一生产与一消费案例(操作栈) 通过使用生产者/消费者模式,容器size()的值不会大于1. 5:一生产与多消费案例(操作栈) 这里出现异常的原因是因为MyStack类中使用了if语句作为条件判断,因为条件发生改变时并没有得到及时的响应,所以多个wait状态的线程被唤醒,继而执行list.remove(0)代码出现异常.将if改成while语句可以解决. 当把if改成while之后会出现假死状态(假死状态).这个时候把MyStack的notify()改成notifyAll()即可正常运行. 6

  • java多线程--生产者消费者实现方式

    1.实现方式1:wait() / notify()方法 源代码: package com.sunny.www.multiThreads.producerAndConsumer.byWaitNotify; import java.util.LinkedList; /** * 实现方式1:wait() / notify()方法 * @author zy */ public class ByWaitNotify { public static void main(String[] args) { //

Tags: