Java多线程——可阻塞的队列BlockingQueue
2017-01-09 16:05
465 查看
阻塞队列与Semaphore有些相似,但也不同,阻塞队列是一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量。
ArrayBlockingQueue
只有put方法和take方法才具有阻塞功能
用3个空间的队列来演示阻塞队列的功能和效果。
用两个具有1个空间的队列来实现同步通知的功能。
ArrayBlockingQueue
只有put方法和take方法才具有阻塞功能
用3个空间的队列来演示阻塞队列的功能和效果。
用两个具有1个空间的队列来实现同步通知的功能。
package java_thread; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class BlockingQueueTest { public static void main(String[] args) { final BlockingQueue queue = new ArrayBlockingQueue(3); for(int i=0;i<2;i++){ //2个线程放数据 new Thread(){ public void run(){ while(true){ try { Thread.sleep((long)(Math.random()*1000)); System.out.println(Thread.currentThread().getName() + "准备放数据!"); queue.put(1); //如果队列满的话,将在这里阻塞 System.out.println(Thread.currentThread().getName() + "已经放了数据," + "队列目前有" + queue.size() + "个数据"); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } new Thread(){ //1个线程取数据 public void run(){ while(true){ try { //将此处的睡眠时间分别改为100和1000,观察运行结果 Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + "准备取数据!"); queue.take(); //如果队列空的话,将在这里阻塞 System.out.println(Thread.currentThread().getName() + "已经取走数据," + "队列目前有" + queue.size() + "个数据"); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } }
相关文章推荐
- Java多线程与并发库高级应用之阻塞队列BlockingQueue
- Java多线程-阻塞队列BlockingQueue
- java多线程之阻塞队列BlockingQueue
- java多线程之阻塞队列BlockingQueue的简单应用
- java中阻塞队列BlockingQueue的用法
- 阻塞队列BlockingQueue
- BlockingQueue(阻塞队列)详解
- java多线程:15、阻塞队列【BlockingQueue】
- Java中 BlockingQueue(阻塞队列)的使用
- Java阻塞队列-BlockingQueue介绍及实现原理
- spring线程池ThreadPoolTaskExecutor与阻塞队列BlockingQueue
- 阻塞队列BlockingQueue实现生产者-消费者模式值桌面搜索
- concurrent包分析-阻塞队列BlockingQueue及其实现类
- 【BlockingQueue】BlockingQueue 阻塞队列实现
- java多线程(二)可阻塞队列BlockingQueue
- JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue
- 关于java中阻塞队列(LinkedBlockingQueue)中任务执行失败后的重试机制几种方案
- 阻塞队列之PriorityBlockingQueue
- Java线程外篇:阻塞队列BlockingQueue