JAVA 线程通信

来源:互联网 发布:广州企业名录数据库 编辑:程序博客网 时间:2024/06/12 20:13

BlockingQueue

   Java 1.5 提供了java.util.concurrent.BlockingQueue接口, 虽然他也是Queue的子接口, 但他的主要用途不是作为容器, 而是用作线程同步的工具 –多个线程通过交替向BlockingQueue放入/取出数据,从而完成线程间通信的目的.

BlockingQueue提供如下方法用于线程间通信:

这里写图片描述

Java为BlockingQueue提供了如下实现:

这里写图片描述

  • ArrayBlockingQueue: 基于数组实现的BlockingQueue.

  • LinkedBlockingQueue: 基于链表实现的BlockingQueue.

  • SynchronousQueue: 同步队列, 对队列的存/取操作必须交替进行.

  • PriorityBlockingQueue: 并不是标准的队列,其take/poll/remove方法返回的是队列中最小元素(其大小关系可以通过实现Comparator接口进行定制).

  • DelayQueue: 一个特殊的BlockingQueue,底层基PriorityBlockingQueue实现.DelayQueue要求集合元素必须实现Delayed接口(该接口里面只有一个long getDelay(TimeUnit unit)方法),DelayQueue根据集合元素的getDelay()方法的返回值进行排序.

使用BlockingQueue实现生产者/消费者模型:

public class ConsumerProducerWithBlockQueue {    private static final int CORE_POOL_SIZE = 5;    private static final int MAX_POOL_SIZE = 20;    private static final int KEEP_ALIVE_TIME = 20;    public static void main(String[] args) {        BlockingQueue<String> queue = getQueue();        Producer producer = new Producer(queue, 1000);        Consumer consumer = new Consumer(queue);        ExecutorService pool = getThreadPool();        pool.submit(producer);        pool.submit(consumer);        pool.submit(consumer);    }    private static BlockingQueue<String> getQueue() {        return new ArrayBlockingQueue<String>(10);    }    private static ExecutorService getThreadPool() {        return new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());    }    private static class Producer implements Runnable {        private BlockingQueue<String> queue;        private int count;        public Producer(BlockingQueue<String> queue, int count) {            this.queue = queue;            this.count = count;        }        public void run() {            Random random = new Random();            while (count-- != 0) {                try {                    Thread.sleep(100);                    queue.put("product " + random.nextInt(100));                } catch (InterruptedException e) {                    throw new RuntimeException(e);                }            }        }    }    private static class Consumer implements Runnable {        private BlockingQueue<String> queue;        public Consumer(BlockingQueue<String> queue) {            this.queue = queue;        }        public void run() {            while (true) {                try {                    String product = queue.take();                    System.out.println(Thread.currentThread().getName() + " " + product);                    Thread.sleep(10);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}
0 0
原创粉丝点击