LinkedBlockingQueue

Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。

http://www.cnblogs.com/linjiqin/archive/2013/05/30/3108188.html

public class Basket {
    // 篮子,能够容纳3个苹果
    BlockingQueue<String> basket = new LinkedBlockingQueue<String>(3);

    public void produce() throws InterruptedException {
        basket.put("An apple");
    }

    public String consume() throws InterruptedException {
        return basket.take();
    }
}

 

class Producer implements Runnable {
    private String instance;
    private Basket basket;

    public Producer(String instance, Basket basket) {
        this.instance = instance;
        this.basket = basket;
    }

    public void run() {
        try {
            while (true) {
                System.out.println("生产者准备生产苹果:" + instance);
                basket.produce();
                System.out.println("!生产者生产苹果完毕:" + instance);
                Thread.sleep(20000);
            }
        } catch (InterruptedException ex) {
            System.out.println("Producer Interrupted");
        }
    }
}

 

class Consumer implements Runnable {
    private String instance;
    private Basket basket;

    public Consumer(String instance, Basket basket) {
        this.instance = instance;
        this.basket = basket;
    }

    public void run() {
        try {
            while (true) {
                System.out.println("消费者准备消费苹果:" + instance);
                System.out.println(basket.consume());
                System.out.println("!消费者消费苹果完毕:" + instance);
                Thread.sleep(5000);
            }
        } catch (InterruptedException ex) {
            System.out.println("Consumer Interrupted");
        }
    }
}

 

public class Test {

    public static void main(String[] args) {
        Basket basket = new Basket();
        ExecutorService service = Executors.newCachedThreadPool();
        Producer producer = new Producer("生产者001", basket);
        //Producer producer2 = new Producer("生产者002", basket);
        Consumer consumer = new Consumer("消费者001", basket);
        service.submit(producer);
        //service.submit(producer2);
        service.submit(consumer);
        // 程序运行5s后,所有任务停止
        // try {
        // Thread.sleep(1000 * 5);
        // } catch (InterruptedException e) {
        // e.printStackTrace();
        // }
        // service.shutdownNow();
    }
}

生产者准备生产苹果:生产者001
!生产者生产苹果完毕:生产者001
消费者准备消费苹果:消费者001
An apple
!消费者消费苹果完毕:消费者001

消费者准备消费苹果:消费者001

生产者准备生产苹果:生产者001
!生产者生产苹果完毕:生产者001
An apple
!消费者消费苹果完毕:消费者001

............

posted @ 2017-11-07 20:42  牧 天  阅读(112)  评论(0)    收藏  举报