使用Notify 和 wait ,使用Linklist实现生产者消费者问题
2024-10-19 00:20:50
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(); } }
最新文章
- 深入分析Spring 与 Spring MVC容器
- genymotion启动虚拟机遇到问题解决方法步骤
- 【redis使用全解析】常见运维操作
- mysql的初识--DOS下的简单命令
- 新版mysql(mysql-5.7.12-winx64)安装
- selectors实现高并发
- submit和button的区别
- 浅谈在实验室的一个作品---8x8x8光立方
- Windows下Mysql解压缩版配置安装与卸载
- 简单的 ";双缓冲"; 绘图的例子(研究一下)
- 【python】一个备份把文件备份到邮箱的python实现
- Prim和Kruskal最小生成树
- bash编程总结
- 第四节:dingo/API 最新版 V2.0 之 Responses (连载)
- 基于jenkins的go语言项目自动化发布遇到的坑
- spring boot之入门Controller常用注解
- centos7 基础命令
- servlet_1
- JeecgBoot版本4月份新版即将发布,抢先体验。。
- windows server 2012 远程桌面不好使
热门文章
- HDU 2809 God of War(DP + 状态压缩)
- EF 存储过程(下)
- javascript 返回顶部
- 『奇葩问题集锦』Zepto 页面唤醒拨号功能点透
- glibc 安装( version `GLIBC_2.14&#39; not found";)
- 【转】mybatis在xml文件中处理大于号小于号的方法
- 4069: [Apio2015]巴厘岛的雕塑
- CKplayer 新手入门超简单使用教程
- 打造属于自己的Altium Designer 3D封装库,不需要懂专门的三维设计软件
- PHP curl传输文件的版本兼容性