生产者消费者问题

import java.util.*;
public class ProducerConsumerTest{
    final int BUFFER_SIZE=10;//缓冲区最大值
    Queue<Integer> queue;//共享缓冲队列
    public ProducerConsumerTest(){
        queue=new LinkedList<Integer>();
    }
    public static void main(String[] args){
        ProducerConsumerTest PC=new ProducerConsumerTest();
        int count=100;
        System.out.println("开始生产消费了哦");
        while(count-->0){
            new Thread(PC.new Producer()).start();
            new Thread(PC.new Consumer()).start();
        }
        
    }
    class Consumer implements Runnable{
        @Override
        public void run() {
            synchronized(queue){
                if(queue.size()==0){
                    try {
                        queue.wait();//释放锁
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else{
                    int x=queue.remove();
                    System.out.println("消费 :"+x);
                    queue.notify();//唤醒生产者
                }
                
            }
        }
    }
    class Producer implements Runnable{

        @Override
        public void run() {
            synchronized(queue){
                if(queue.size()==BUFFER_SIZE){
                    try {
                        queue.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }    
                }else{
                    int x=queue.size()+1;
                    queue.add(x);
                    System.out.println("生产 :"+x);
                    queue.notify();
                }
            }
        }
        
    }
    
}

 加上Executor,BlockingQueue

import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;


public class ProducerConsumerTest{
    final int BUFFER_SIZE=10;
    final String[] produce=new String[5];
    LinkedBlockingQueue<String> queue;
    public ProducerConsumerTest(){
        queue=new LinkedBlockingQueue<String>(BUFFER_SIZE);
        produce[0]="水";
        produce[1]="面包";
        produce[2]="空气";        
        produce[3]="快乐";
        produce[4]="灾难";
    }
    public static void main(String[] args) throws InterruptedException{
        ProducerConsumerTest PC=new ProducerConsumerTest();
        System.out.println("开始生产消费了哦");
        ExecutorService exec=Executors.newCachedThreadPool();
        exec.execute(new Thread(PC.new Producer()));
        TimeUnit.MILLISECONDS.sleep(1000);//先给我生产一会,好吧
        exec.execute(new Thread(PC.new Consumer()));
        exec.shutdown();
    }
    class Consumer implements Runnable{
        @Override
        public void run() {    
            while(true){
                try {
                    String p = queue.take();
                    System.out.println("消费 :"+p);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
            }    
        }
    }
    class Producer implements Runnable{        
        @Override
        public void run() {
            Random rand=new Random();
            int count=10000;
            while(count-->0){
                try {
                    int x=rand.nextInt(5);
                    queue.put(produce[x]);
                    System.out.println("生产 :"+produce[x]);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
    
}
原文地址:https://www.cnblogs.com/wqkant/p/6854148.html