ref:http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html

注释很清楚的,

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; //产品
class Product
{
String name=null;
public Product(String name)
{
this.name=name;
} } class Buffer
{
private Queue<Product> queue=new LinkedList<Product>();//一个普通队列,同时作为同步的对象
private final int size=5; //最大长度为,可以自己调整
public void add(Product p)//
{
synchronized (queue) {
while(queue.size()==size)
{
System.out.println(Thread.currentThread().getName()+"队列已经满了,生产者释放锁");
try {
queue.wait(); //队列未满,则放弃锁,进行挂起,等到queue,notify,有个线程会重新从wait后运行
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
queue.offer(p); System.out.println(Thread.currentThread().getName()+"入队 "+queue.size()); queue.notify();//加入一个元素,则通因为为空而挂起的线程 } } public void remove()
{
synchronized (queue) {
while(queue.size()<=0)
{ System.out.println(Thread.currentThread().getName()+"队列为空,释放锁");
try {
queue.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
queue.poll();
System.out.println(Thread.currentThread().getName()+"出队,剩下"+queue.size());
queue.notify(); } } } class Producer implements Runnable
{
private Buffer buf; //所有线程共享一个buffer,所以作为参数 public Producer(Buffer buf)
{
this.buf=buf;
} @Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
{
try {
Thread.sleep(3000); //控制生产速度,可以让生产快,还是消费快,来观察队列的情况,
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
buf.add(new Product("zhang "+i));
} } }
class Customer implements Runnable
{
private Buffer buf=null;
public Customer(Buffer buf)
{
this.buf=buf;
}
@Override
public void run() {
for(int i=0;i<10;i++)
{
try {
Thread.sleep(1);//控制生产速度,,
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//
buf.remove();
} } } public class 生产消费者 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub //学学使用线程池
Buffer buf=new Buffer();
ExecutorService exe=Executors.newCachedThreadPool();//一个简单的线程池
int i=0;
while(i++<2)
{
exe.submit(new Producer(buf)); //生产者两个线程 }
i=0;
while(i++<2)
{
exe.submit(new Customer(buf));//消费者两个线程
}
exe.shutdown(); } }

最新文章

  1. 深入分析Spring 与 Spring MVC容器
  2. genymotion启动虚拟机遇到问题解决方法步骤
  3. 【redis使用全解析】常见运维操作
  4. mysql的初识--DOS下的简单命令
  5. 新版mysql(mysql-5.7.12-winx64)安装
  6. selectors实现高并发
  7. submit和button的区别
  8. 浅谈在实验室的一个作品---8x8x8光立方
  9. Windows下Mysql解压缩版配置安装与卸载
  10. 简单的 &quot;双缓冲&quot; 绘图的例子(研究一下)
  11. 【python】一个备份把文件备份到邮箱的python实现
  12. Prim和Kruskal最小生成树
  13. bash编程总结
  14. 第四节:dingo/API 最新版 V2.0 之 Responses (连载)
  15. 基于jenkins的go语言项目自动化发布遇到的坑
  16. spring boot之入门Controller常用注解
  17. centos7 基础命令
  18. servlet_1
  19. JeecgBoot版本4月份新版即将发布,抢先体验。。
  20. windows server 2012 远程桌面不好使

热门文章

  1. HDU 2809 God of War(DP + 状态压缩)
  2. EF 存储过程(下)
  3. javascript 返回顶部
  4. 『奇葩问题集锦』Zepto 页面唤醒拨号功能点透
  5. glibc 安装( version `GLIBC_2.14&#39; not found&quot;)
  6. 【转】mybatis在xml文件中处理大于号小于号的方法
  7. 4069: [Apio2015]巴厘岛的雕塑
  8. CKplayer 新手入门超简单使用教程
  9. 打造属于自己的Altium Designer 3D封装库,不需要懂专门的三维设计软件
  10. PHP curl传输文件的版本兼容性