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成功。

最新文章

  1. 安装R语言扩展包diveRsity-1
  2. 第6章 第一个Linux驱动程序:统计单词个数
  3. 深度学习框架 Torch 7 问题笔记
  4. IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream
  5. 连接QuickBooks Online实现于IOS App数据同步功能的个人记录
  6. mysql-linux命令登录,退出
  7. sqlserver2008清日志
  8. 用php计算行列式
  9. vs 2012 智能提示后为何不能 直接按enter键把提示的内容输入
  10. android操作通讯录的联系人
  11. java并发之CountDownLatch、Semaphore和CyclicBarrier
  12. Android - 向服务器发送数据(GET).
  13. JavaScript高级程序设计5.pdf
  14. log4Net配置详解
  15. QCA4002/QCA4004 为主流家电和消费电子产品推出低功耗Wi-Fi平台
  16. 新手立体四子棋AI教程(1)——基础扫盲
  17. 基于hashchange导航管理
  18. zookeeper集群的简单搭建
  19. js左右大小变化
  20. Python3解析html高级操作

热门文章

  1. [C++] 频谱图中 FFT快速傅里叶变换C++实现
  2. LeetCode OJ--Implement strStr()
  3. web开发规范文档
  4. ubuntu下安装翻译软件
  5. 阿里云***(java应用)
  6. Spring注入内部的Beans
  7. C# 把控件内容导出图片
  8. 转: DNS 原理入门 (from 阮一峰)
  9. Android实现SQLite数据库的增、删、改、查的操作
  10. linux cat 文件操作