Java可阻塞队列-ArrayBlockingQueue

发表于:2016-1-18 09:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:哎呦喂    来源:51Testing软件测试网采编

  在前面的的文章,写了一个带有缓冲区的队列,是用JAVA的Lock下的Condition实现的,但是JAVA类中提供了这项功能,就是ArrayBlockingQueue,
  ArrayBlockingQueue是由数组支持的有界阻塞队列,次队列按照FIFO(先进先出)原则,当队列已经填满,在去增加则会导致阻塞,这种阻塞类似线程阻塞。
  ArrayBlockingQueue提供的增加和取出方法总结
  使用ArrayBlockingQueue的一个子类BlockingQueue实现一个可阻塞队列,一个线程put另一个线程take,当队列为空时take等待,当线程满时put等待
  此实现方式没有线程互斥
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* 可阻塞的队列
* BlockingQueue
* 此方式不能实现线程互斥
* @author
*
*/
public class BlockingQueueCommunicationTest {
public static void main(String[] args) {
final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(3);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(new Random().nextInt(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(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(new Random().nextInt(1000));
System.out.println("线程"
+ Thread.currentThread().getName() + "准备取走");
queue.take();
System.out.println("线程"
+ Thread.currentThread().getName() + "已取走,队列剩余"
+ queue.size() + "个");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号