java多线程系列10 阻塞队列模拟
接下来的几篇博客会介绍下juc包下的相关数据结构
包含queue,list,map等
这篇文章主要模拟下阻塞队列。
下面是代码
import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicInteger; public class MyBlockingQueue<T> { private final LinkedList<T> queue = new LinkedList<>();
private final AtomicInteger size = new AtomicInteger(0);
private final Object lock = new Object();
private final int maxSize ;
public MyBlockingQueue(int maxSize) {
this.maxSize = maxSize;
} public void add(T t) {
synchronized (lock) {
while (size.get() == maxSize) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
queue.add(t);
size.incrementAndGet();
lock.notifyAll();
} } public T poll() { T result = null;
synchronized (lock) {
while (size.get() == 0) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} }
result = queue.removeFirst();
size.decrementAndGet();
lock.notifyAll();
}
return result;
}
public int getSize()
{
return size.get();
} public static void main(String[] args) {
final MyBlockingQueue<String> queue = new MyBlockingQueue<>(1);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
queue.add("h");
queue.add("j");
queue.add("h1");
queue.add("j1");
queue.add("h2");
queue.add("j2");
}
}, "t1"); Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
while(true)
{
Thread.sleep(1000);
System.out.println("t2取走的元素为:" + queue.poll());
} } catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "t2");
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
try {
while(true)
{
Thread.sleep(1000);
System.out.println("t3取走的元素为:" + queue.poll());
} } catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "t3");
t1.start();
t2.start();
t3.start(); }
}
java多线程系列10 阻塞队列模拟的更多相关文章
- Java多线程-新特征-阻塞队列ArrayBlockingQueue
阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素 ...
- java多线程系列6-阻塞队列
这篇文章将使用经典的生产者消费者的例子来进一步巩固java多线程通信,介绍使用阻塞队列来简化程序 下面是一个经典的生产者消费者的例子: 假设使用缓冲区存储整数,缓冲区的大小是受限制的.缓冲区提供wri ...
- java多线程8:阻塞队列与Fork/Join框架
队列(Queue),是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的. BlockingQueue 而阻塞队列BlockingQueue除了继承 ...
- Java多线程系列——线程阻塞工具类LockSupport
简述 LockSupport 是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞. 和 Thread.suspend()相比,它弥补了由于 resume()在前发生,导致线程无法继续执 ...
- Java多线程系列- DelayQueue延时队列
我们在开发中,有如下场景 a) 关闭空闲连接.服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之.b) 缓存.缓存中的对象,超过了空闲时间,需要从缓存中移出.c) 任务超时处理.在网络协议滑动窗 ...
- java多线程系列 目录
Java多线程系列1 线程创建以及状态切换 Java多线程系列2 线程常见方法介绍 Java多线程系列3 synchronized 关键词 Java多线程系列4 线程交互(wait和 ...
- java多线程系列8-线程的优先级
在java中设置线程优先级使用setPriority,在jdk中的源代码如下: public final void setPriority(int newPriority) { ThreadGroup ...
- Java多线程系列——从菜鸟到入门
持续更新系列. 参考自Java多线程系列目录(共43篇).<Java并发编程实战>.<实战Java高并发程序设计>.<Java并发编程的艺术>. 基础 Java多线 ...
- Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例
概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)Cyc ...
随机推荐
- python开发购物车
1 业务需求 商品中心 显示库存的商品 商品能够加入到购物车 个人中心 购物车 修改购物车的商品 下单 完成的订单 订单详情 账户余额 2 代码实现 # 定义全局变量信息 # 商品编号信息 goods ...
- Ajax请求的几个小练习
Ajax请求的几个小练习 准备工作 路由中做了分发: re_path('^app01/',include('app01.url')) app01中url.py文件的内容: from django.ur ...
- vim中行末去掉^M
方式1: 输入 :%s/^M//g 方式2: 输入:%s/\r//g
- Struts2 环境搭建
1.引入相关struts2 jar包 2.web.xml <?xml version="1.0" encoding="UTF-8"?> <we ...
- xsy子矩形
考虑一种解题方法,枚举上下边界L,R, 然后二分答案T,我们要判断的是否存在 \[ \frac{(sum_j - sum_i)}{2 * (R - L + 1 + j - i)} \ge T \] 也 ...
- django之用户表的继承
有这样一个场景,之前已经设计好了用户的信息表,但是再设计另外一个业务表的时候,信息有点重复,如何重新设计呢? 可以采用表的继承,让一个表作为基类,业务表就可以继承它 要注意以下几点 1 作为基类的表使 ...
- Spring AOP初级——入门及简单应用
在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是 ...
- gentoo 工具命令
查看具体某个命令来源于哪个软件包,使用 equery,比如说查找 lsusb 来源于哪个包,可以用 equery belongs lsusb
- Rabbitmq 与springboot 结合
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- dir函数
dir函数: dir() 是一个内置函数,用于列出对象的所有属性及方法 下面进行尝试: 用下面两个tests test2文件做实验 #创建一个类,两个常量,类中函数test1,类中属性, class ...