java实现BlockingQueue队列
来源:互联网 发布:ubuntu 16.04 vi使用 编辑:程序博客网 时间:2024/06/14 08:14
学习多线程的过程中用代码实现的BlockingQueue队列。
阻塞队列实现类。
package com.xtli.controller.thread;import java.util.LinkedList;public class BlockingQueueTest {LinkedList<String> BQList = new LinkedList<String>();private int size = 0;//队列大小private int count = 0;//队列计数器private Object obj = new Object();//同步对象public BlockingQueueTest(int size) {this.size = size;}public void inQueue(String str) {synchronized(obj) {System.out.println("线程"+Thread.currentThread().getName()+":"+str+"准备进入队列。。");if(this.size == count) {try {System.out.println("线程"+Thread.currentThread().getName()+":"+"队列已满,阻塞。。");obj.wait();//等待其他线程从队列中取值} catch (InterruptedException e) {e.printStackTrace();}}BQList.add(str);count++;System.out.println("线程"+Thread.currentThread().getName()+":"+str+"成功进入队列。。");System.out.println("当前队列中的值为:"+BQList.toString());obj.notifyAll();//通知等待的其他线程}}public String outQueue() {synchronized(obj) {System.out.println("线程"+Thread.currentThread().getName()+":"+"准备从队列中取值。。");if(this.count == 0) {try {System.out.println("线程"+Thread.currentThread().getName()+":"+"队列已空,阻塞。。");obj.wait();//等待其他线程,往队列里塞值} catch (InterruptedException e) {e.printStackTrace();}}count--;String str = BQList.pollFirst();System.out.println("线程"+Thread.currentThread().getName()+":"+str+"成功出队列。。");System.out.println("当前队列中的值为:"+BQList.toString());obj.notifyAll();//通知等待的其他线程return str;}}}
启用两个线程,一个线程向队列中塞值,另外一个从队列中取值。
package com.xtli.controller.thread;public class BlockingQueueMain {static BlockingQueueTest BQ = new BlockingQueueTest(3);static class BlockingQueueInQueue extends Thread {public void run() {for(int i=0;i<5;i++) {//向队列中塞了5个值BQ.inQueue(String.valueOf(i));}}}static class BlockingQueueOutQueue extends Thread {public void run() {for(int i=0;i<6;i++) {//从队列中取了6个值BQ.outQueue();}}}public static void main(String[] args) throws InterruptedException {/*final BlockingQueueTest BQ = new BlockingQueueTest(3);BQ.inQueue("1");BQ.inQueue("2");BQ.inQueue("3");Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {BQ.inQueue("4");BQ.inQueue("5");}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {String str1 = BQ.outQueue();System.out.println(str1);String str2 = BQ.outQueue();System.out.println(str2);}});t1.start();Thread.sleep(1000);t2.start();*/new BlockingQueueInQueue().start();new BlockingQueueOutQueue().start();}}在BlockingQueueMain中,BlockingQueueInQueue向队列中塞了5次值,而BlockingQueueOutQueue从队列中取了6次,前5次均能正常取出,当第6次再次取值时,因为此时队列已空,此线程会一直处于等待状态。
BlockingQueueOutQueue如果循环5次从队列中取值,如下
BlockingQueueInQueue如果循环6次,BlockingQueueOutQueue循环5次,结果如下。
0 0
- java实现BlockingQueue队列
- java实现BlockingQueue接口的队列解析
- java多线程 队列 BlockingQueue
- Java 阻塞队列 BlockingQueue
- java 阻塞队列BlockingQueue
- Java : BlockingQueue 阻塞队列
- JAVA阻塞队列BlockingQueue
- JAVA线程队列BlockingQueue
- Java使用阻塞队列BlockingQueue实现线程同步
- Java并发编程-阻塞队列(BlockingQueue)的实现原理
- Java阻塞队列-BlockingQueue介绍及实现原理
- Java并发编程-阻塞队列(BlockingQueue)的实现原理
- Java并发编程-阻塞队列(BlockingQueue)的实现原理
- BlockingQueue队列实现线程池
- BlockingQueue的各种实现队列
- Java多线程-阻塞队列BlockingQueue
- Java线程:阻塞队列BlockingQueue
- BlockingQueue 阻塞队列 -- Java 多线程
- MySQL5.7 The server time zone value 异常处理
- 安装redis-执行make命令报错解决方法
- 设计模式之单例模式
- 散列表——分离链接法
- 单链表的反转
- java实现BlockingQueue队列
- as 提示duplicate entry:
- Scala Currying
- 缓存穿透、缓存并发、缓存失效之思路变迁
- Vue.js的生命周期
- windows下zookeeper伪集群搭建
- 遍历table中的tr td
- Vue.js 表单控件
- 装python2.7和3.5兼容性的问题