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
- JAVA线程-线程间通信
- java线程通信
- java 线程间通信
- Java.线程通信
- java线程通信
- java线程通信复习
- Java 线程通信
- Java线程通信机制
- java线程间通信
- Java线程通信 (一)
- java 线程通信
- Java线程通信
- Java线程间通信
- java 线程通信
- Java复习--线程通信
- java线程间通信
- Java中线程通信
- java中的线程通信
- android知识回顾之view工作流程
- dojo——AMD中class使用
- java.lang.NoSuchMethodError ljava/util/list
- js通过类名获取元素(通用版)
- 关于开发百度地图的定位以及导航的代码记录
- JAVA 线程通信
- HackerRank - number-game-on-a-tree
- eclipse调试java程序的九个技巧
- VS2008 :Msbuildtoolspath is not specified for the ToolsVersion
- 109-PCF8591 4路AD数码管显示
- NumberUtils的用法
- URI和URL的区别
- linux-centos 为什么crond执行完没有了邮件日子通知?
- Linux下Nginx快捷启动关闭设置