多线程-模拟阻塞queue队列
前阵子学习了多线程,现在进行总结一下,模拟队列。
分析问题:
(1)首先需要一个容器存放元素,这里用linkedList队列。
(2)每次像容器中添加或删除元素的时候需要计数,所以这里需要一个计数器,这里用原子类的atomicInter实现。
(3)需要三个方法,一个put()方法,向容器中推数据,一个take()方法,向容器中取数据,一个size()方法,返回当前容器的大小。
实现代码如下:
public class MyQueue {
//队列
private volatile LinkedList<Object> linkedList=new LinkedList<Object>();
//队列最大数
private int maxSize;
//队列最小数
private int minSize=0;
//计数器
private AtomicInteger count=new AtomicInteger(0);
//创建锁
private Object lock=new Object();
//初始化队列大小
public MyQueue(int maxSize){
this.maxSize=maxSize;
}
//返回当前队列的大小
public int getSize(){
return count.get();
}
//向队列添加元素方法
public void put(Object obj){
synchronized(lock){
if(getSize()==maxSize){
System.out.println("线程进入put方法中,阻塞中...");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
linkedList.add(obj);
count.getAndIncrement();
System.out.println("向队列中添加元素:"+obj);
lock.notify();//当容器大小为minSize时,且线程进行take操作时,执行了wait方法,进入了阻塞状态,所以添加完数据应该唤醒线程,进行数据take操作
}
}
//向队列中取出元素
public Object take(){
Object temp="";
synchronized(lock){
if(getSize()==minSize){
System.out.println("线程进入take方法中,阻塞中...");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
temp=linkedList.removeFirst();
count.getAndDecrement();
System.out.println("被取出的元素为:"+temp);
lock.notify();//当容器大小为maxSize时,且线程进行put操作时,执行了wait方法,进入了阻塞状态,所以取完数据应该唤醒线程,进行数据put操作
}
return temp;
}
public static void main(String []args){
//初始化容器
final MyQueue myQueue=new MyQueue(5);
myQueue.put("A");
myQueue.put("B");
myQueue.put("C");
myQueue.put("D");
myQueue.put("E");
Thread t1=new Thread(new Runnable() {
public void run() {
myQueue.put("F");
}
},"t1");
Thread t2=new Thread(new Runnable() {
public void run() {
myQueue.take();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"t2");
Thread t3=new Thread(new Runnable() {
public void run() {
myQueue.take();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"t3");
Thread t4=new Thread(new Runnable() {
public void run() {
myQueue.put("G");
}
},"t4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
多线程-模拟阻塞queue队列的更多相关文章
- Java多线程——可阻塞的队列BlockingQueue
阻塞队列与Semaphore有些相似,但也不同,阻塞队列是一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量. ArrayBlockingQueue 只有put方法和ta ...
- python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)
今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系 ...
- Java多线程与并发库高级应用-可阻塞的队列
ArrayBlockQueue 可阻塞的队列 > 队列包含固定长度的队列和不固定长度的队列. > ArrayBlockQueue > 看BlockingQueue类的帮助文档,其中有 ...
- 使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点?
我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用 ...
- Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)
一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...
- 8.12 day31 进程间通信 Queue队列使用 生产者消费者模型 线程理论 创建及对象属性方法 线程互斥锁 守护线程
进程补充 进程通信 要想实现进程间通信,可以用管道或者队列 队列比管道更好用(队列自带管道和锁) 管道和队列的共同特点:数据只有一份,取完就没了 无法重复获取用一份数据 队列特点:先进先出 堆栈特点: ...
- Python中多线程的阻塞问题
在使用Queue模块+多线程模拟生产者+消费者问题时,遇到了一个小问题,现在记录下来.供可能会遇到类似问题的初学者们参考. 该问题的完整参考代码如下.主要实现了以下的功能:在一个线程中,开启生产者模式 ...
- Java并发包源码学习系列:基于CAS非阻塞并发队列ConcurrentLinkedQueue源码解析
目录 非阻塞并发队列ConcurrentLinkedQueue概述 结构组成 基本不变式 head的不变式与可变式 tail的不变式与可变式 offer操作 源码解析 图解offer操作 JDK1.6 ...
- atitit. java queue 队列体系and自定义基于数据库的队列总结o7t
atitit. java queue 队列体系and自定义基于数据库的队列总结o7t 1. 阻塞队列和非阻塞队列 1 2. java.util.Queue接口, 1 3. ConcurrentLink ...
随机推荐
- 理解PHP中会话控制
如果以前没有接触过建站或网络编程,只是从头开始学PHP,以及用PHP来建立动态站点,那么会话(SESSION)对于初学者就有点难理解.那么到底什么是会话呢?理解一个概念需要从它产生的背景或问题出发,所 ...
- 手动爬虫之流程笔记1(python3)
一.引入拓展库 由于刚刚起步学习爬虫,故从urllib库开始 首先引入urllib,这里主要用到urllib中request类 import urllib.request as ur 二.设置全局参数 ...
- 并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)
1.线程理论以及线程的两种创建方法 2.线程之间是数据共享的与join方法 3.多线程和多进程的效率对比 4.数据共享的补充线程开启太快 5.线程锁 互斥锁 同步锁 6.死锁现象和递归锁 7.守护线程 ...
- 《挑战程序设计竞赛》2.4 数据结构-并查集 POJ1182 2236 1703 AOJ2170
POJ1182 http://poj.org/problem?id=1182 题目 难得的中文题... 食物链 Time Limit: 1000MS Memory Limit: 10000K Tota ...
- Powershell Get Domain Mailbox的几种方法
一.Disconnected Mailboxes 1.Finding Disconnected Mailboxes The first function is called Get-Disconnec ...
- work_log
机房搬迁 1. 虚拟机-à实体机 2. ldap 服务器 3. 考勤数据服务器 4. glpi 权限管理. 5. 备份脚本. 6. 试验jira重新启动. Luke--- 1,报价文档,相关技术者,技 ...
- 好难忘又伤心一个非常好的学习js群解散了
不知道为什么看到web前端之天天向上这个群解散,好难过.应该可以说,这个群是我见过比较靠谱的群,大家都非常热情帮助.那些管理员管理的非常好,突然解散了.觉得好可惜,也不会因为你是菜鸟不让你加,感觉好可 ...
- 命令行操作flask
Flask-Script 先安装pip3 install Flask-Script from sansa import create_app from flask_script import Mana ...
- Python__return
return的注意点: return返回的值, 没有任何类型限制 return是函数结束的标志,函数内可以写多个return,但执行一次,函数就立刻结束,并把return后的值作为本次调用的返回值.
- BeanUtils.copyProperties()
BeanUtils.copyProperties() PropertyUtils.copyProperties() 通过反射将一个对象的值赋值个另外一个对象(前提是对象中属性的名字相同). 后付前 P ...