java多线程实现简单队列
2024-09-07 04:47:52
1.创建Queue.java
public class Queue { private LinkedList<Object> list = new LinkedList<Object>() ; private final int minSize = 0 ; ; private final int maxSize ; private AtomicInteger count = new AtomicInteger(0) ; public Queue(int size){
this.maxSize = size ;
}
private final Object lock = new Object() ; public void put(Object o){
synchronized(lock){
while(size() == this.maxSize){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add(o) ;
//计数器增加
count.incrementAndGet() ;
//通知唤醒
lock.notify();
}
} private int size(){
return count.get() ;
} public Object take(){
Object res = null ;
synchronized(lock){
while(size() == this.minSize){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
res = list.removeFirst();
//计数器减1
count.decrementAndGet() ;
lock.notify();
}
return res ; } public static void main(String[] args) { final Queue mq = new Queue(3) ; mq.put("a");
mq.put("b");
mq.put("c"); new Thread(new Runnable() { @Override
public void run() {
mq.put("g");
System.out.println("put1 secceseful");
mq.put("f");
System.out.println("put2 secceseful");
}
}).start(); new Thread(new Runnable() { @Override
public void run() {
System.out.println("take value = "+mq.take() );
}
}).start(); }
}
运行结果如下:
take value = a
put1 secceseful
执行第一个put的时候由于队列容量已经满了,所以线程阻塞。另一个线程take之后,阻塞的线程继续执行put成功。
最新文章
- 安装R语言扩展包diveRsity-1
- 第6章 第一个Linux驱动程序:统计单词个数
- 深度学习框架 Torch 7 问题笔记
- IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream
- 连接QuickBooks Online实现于IOS App数据同步功能的个人记录
- mysql-linux命令登录,退出
- sqlserver2008清日志
- 用php计算行列式
- vs 2012 智能提示后为何不能 直接按enter键把提示的内容输入
- android操作通讯录的联系人
- java并发之CountDownLatch、Semaphore和CyclicBarrier
- Android - 向服务器发送数据(GET).
- JavaScript高级程序设计5.pdf
- log4Net配置详解
- QCA4002/QCA4004 为主流家电和消费电子产品推出低功耗Wi-Fi平台
- 新手立体四子棋AI教程(1)——基础扫盲
- 基于hashchange导航管理
- zookeeper集群的简单搭建
- js左右大小变化
- Python3解析html高级操作