java多线程解决生产者消费者问题
2016-04-27 11:03
543 查看
/* *生产者和消费者案例 */ publicclassTestProductorAndConsumer{ publicstaticvoidmain(String[]args){ Clerkclerk=newClerk(); Productorpro=newProductor(clerk); Consumercus=newConsumer(clerk); newThread(pro,"生产者A").start(); newThread(cus,"消费者B").start(); } } //店员 classClerk{ privateintproduct=0; //进货 publicsynchronizedvoidget(){//循环次数:0 while(product>=1){//为了避免虚假唤醒问题,应该总是使用在循环中 System.out.println("产品已满!"); try{ this.wait(); }catch(InterruptedExceptione){ } } System.out.println(Thread.currentThread().getName()+":"+++product); this.notifyAll(); } //卖货 publicsynchronizedvoidsale(){//product=0;循环次数:0 while(product<=0){ System.out.println("缺货!"); try{ this.wait(); }catch(InterruptedExceptione){ } } System.out.println(Thread.currentThread().getName()+":"+--product); this.notifyAll(); } } //生产者 classProductorimplementsRunnable{ privateClerkclerk; publicProductor(Clerkclerk){ this.clerk=clerk; } @Override publicvoidrun(){ for(inti=0;i<20;i++){ try{ Thread.sleep(200); }catch(InterruptedExceptione){ } clerk.get(); } } } //消费者 classConsumerimplementsRunnable{ privateClerkclerk; publicConsumer(Clerkclerk){ this.clerk=clerk; } @Override publicvoidrun(){ for(inti=0;i<20;i++){ clerk.sale(); } } }
上边代码主要介绍了java多线程解决生产者消费者问题的方法,实例分析了java采用多线程的方法解决生产者消费者问题的相关技巧,需要的朋友可以参考下
另外concurrent包下面在执行多线程的时候也给出了特性阻塞队列BlockingQueue用法如下:也可以实现生产者和消费者模式
importjava.util.concurrent.LinkedBlockingQueue;
publicclassTest{
publicstaticvoidmain(String[]args){
//固定容器大小为10
BlockingQueue<Food>foods=newLinkedBlockingQueue<Food>(10);
Threadproduce=newThread(newProduce(foods));
Threadconsume=newThread(newConsume(foods));
produce.start();
consume.start();
}
}
/**
*生产者
*/
classProduceimplementsRunnable{
privateBlockingQueue<Food>foods;
Produce(BlockingQueue<Food>foods){
this.foods=foods;
}
@Override
publicvoidrun(){
inti=0;
while(i<=10){
try{
//当生产的食品数量装满了容器,那么在while里面该食品容器(阻塞队列)会自动阻塞wait状态等待消费
foods.put(newFood("食品"+i));
i++;
}catch(InterruptedExceptione){
e.printStackTrace();//TochangebodyofcatchstatementuseFile|Settings|FileTemplates.
}
}
}
}
/**
*消费者
*/
classConsumeimplementsRunnable{
privateBlockingQueue<Food>foods;
Consume(BlockingQueue<Food>foods){
this.foods=foods;
}
@Override
publicvoidrun(){
try{
Thread.sleep(1000);//用于测试当生产者生产满10个食品后是否进入等待状态
while(true){
//当容器里面的食品数量为空时,那么在while里面该食品容器(阻塞队列)会自动阻塞wait状态等待生产
Foodfood=foods.take();
System.out.println("消费"+food.getName());
}
}catch(InterruptedExceptione){
e.printStackTrace();//TochangebodyofcatchstatementuseFile|Settings|FileTemplates.
}
}
}
/**
*食品
*/
classFood{
privateStringname;
StringgetName(){
returnname;
}
Food(Stringname){
this.name=name;
System.out.println("生产"+name);
}
}
相关文章推荐
- ubuntu系统下eclipse的安装
- spring 注解实现 定时任务
- KMP算法的简单总结以及java代码实现
- Eclipse下进行SVN提交时报“svn: 过期”错误的解决办法
- ElasticSearch学习15_Elasticsearch 口水篇(4)java客户端 - 原生ESClient
- java只使用try和finally不使用catch的原因和场景
- Eclipse 4.5+(Mars)安装SVN
- Spring事务和异常回滚
- Java NumberFormatException详解
- Java基础知识IO流(字节流File读取操作)
- java四种运算符
- 深入理解java嵌套类和内部类、匿名类
- Java性能监控系列——java.lang.instrument
- Struts流程
- 今天晚上 中国互联网被Struts2漏洞血洗
- PAT乙级(Basic Level)真题 >福尔摩斯的约会 (Java记录)
- Struts2理解--动态方法和method属性及通配符_默认Action
- sha1加密java代码
- Java Observable 模式
- java代码实现二叉排序树