Java 实现生产者消费者问题

来源:互联网 发布:21天学通c语言 下载 编辑:程序博客网 时间:2024/06/05 21:50

最近复习Java,重写了生产者消费者问题。
采用synchronized锁以及wait notify方法实现。

package Thread;import java.util.LinkedList;class Producer implements Runnable{    ProducerConsumer p;    String name;    Producer(ProducerConsumer p, String name){        this.p = p;        this.name = name;    }    @Override    public void run(){        // TODO Auto-generated method stub        while(true){            try{                Thread.sleep(1000);                p.putOne();            } catch (InterruptedException e){                e.printStackTrace();            }        }    }}class Consumer implements Runnable{    ProducerConsumer p;    String name;    Consumer(ProducerConsumer p, String name){        this.p = p;        this.name = name;    }    @Override    public void run() {        // TODO Auto-generated method stub        while(true){            try{                Thread.sleep(1000);                p.getOne();            } catch (InterruptedException e){                e.printStackTrace();            }        }    }}public class ProducerConsumer {    private byte[] b = new byte[0];    private static LinkedList<Object> store = new LinkedList<Object>();    public int putOne() throws InterruptedException{        synchronized(b){            if(store.size() >= 10){                b.wait();                return 1;              }             else{                Object e = new Object();                store.add(e);                System.out.println("Add one to " + store.size() + " by " + Thread.currentThread());                b.notifyAll();                return 0;            }        }    }    public int getOne() throws InterruptedException{        synchronized(b){            if(store.size() == 0){                System.out.println("before wait");                b.wait();                System.out.println("after wait");                return 1;  //这里不return,直接removeFirst也可以。            }            else{                store.removeFirst();                System.out.println("remove one to " + store.size() + " by " + Thread.currentThread());                b.notifyAll();                return 0;            }        }    }    public static void main(String[] args) {        // TODO Auto-generated method stub        ProducerConsumer P = new ProducerConsumer();        Runnable[] thread = new Runnable[6];        for(int i = 0; i < 3; ++i){            thread[i] = new Consumer(P, "Consumer" + i);        }        for(int i = 3; i < 6; ++i){            thread[i] = new Producer(P, "Producer" + i);        }        for(int i=0; i < 6; ++i){            new Thread(thread[i]).start();        }        /*        new Thread(thread[1]).start();        new Thread(thread[4]).start();        上面两句输出的前三句一定为        before wait        Add one to 1 by Thread[Thread-1,5,main]        after wait        */    }}
原创粉丝点击