用blockingqueue实现生产者消费者

生产者:

import java.util.concurrent.BlockingQueue;

public class Producer implements Runnable{
    BlockingQueue<String> queue;
    public Producer(BlockingQueue<String> queue) {
        this.queue=queue;
    }
    @Override
    public void run() {
        try {
            String temp="Producer生产的线程被消费了"+Thread.currentThread().getName();
            System.out.println("I have made a product:"+Thread.currentThread().getName());
            queue.put(temp);//队列满了会阻塞当前线程,必须是put
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

消费者:

import java.util.concurrent.BlockingQueue;

public class Consumer implements Runnable{
    BlockingQueue<String> queue;
    public Consumer(BlockingQueue<String> queue) {
        this.queue=queue;
    }
    @Override
    public void run() {
        String temp;
        try {
            temp = queue.take();//队列为空就会阻塞当前线程
            System.out.println(temp);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }

}

测试:

public class Test {

    public static void main(String[] args) {
        BlockingQueue<String> queue=new LinkedBlockingQueue<String>(2);//这里不传入2的话默认是Integer.maxValue
        Consumer consumer=new Consumer(queue);
        Producer producer=new Producer(queue);
        for(int i=0;i<5;i++) {
            new Thread(producer,"Producer"+(i+1)).start();
            new Thread(consumer,"Consumer"+(i+1)).start();
        }
    }

}

输出:

I have made a product:Producer1
Producer生产的线程被消费了Producer1
I have made a product:Producer2
I have made a product:Producer3
Producer生产的线程被消费了Producer2
Producer生产的线程被消费了Producer3
I have made a product:Producer5
I have made a product:Producer4
Producer生产的线程被消费了Producer5
Producer生产的线程被消费了Producer4

 

posted @ 2019-08-13 12:53  LeeJuly  阅读(228)  评论(0)    收藏  举报