Java 线程实现生产者和消费者问题
2012-10-26 00:49 coffeescript 阅读(316) 评论(0) 收藏 举报线程安全
定义三个类,店员类(TestClerk.java),假设店员每次只能持有一个商品。生产者类(TestProducer.java),消费者类(TestConsumer.java),当店员持有商品为-1(即没有商品)时,通知消费者等待,当店员持有商品不等于-1(即持有1件或多件商品)时,通知生产者等待。
TestClerk.java
View Code
1 View Code 2 3 public class TestClerk{ 4 private int product=-1; 5 6 public synchronized void setProduct(int product){ 7 if(this.product!=-1){//店员手中的product,不是生产者手中的product,否则会发生阻塞 8 try{ 9 wait(); 10 }catch(InterruptedException e){ 11 e.printStackTrace(); 12 } 13 } 14 this.product=product; 15 System.out.println("生产者生产了("+this.product+")"); 16 notify(); 17 } 18 19 public synchronized int getProduct(){ 20 if(this.product==-1){ 21 try{ 22 wait(); 23 }catch(InterruptedException e){ 24 System.out.println(e.getMessage()); 25 } 26 } 27 int p=this.product; 28 System.out.println("消费者消费了("+p+")"); 29 this.product=-1; 30 notify(); 31 return p; 32 } 33 }
TestProducer.java
View Code
1 View Code 2 3 public class TestProducer extends Thread{ 4 private TestClerk clerk; 5 6 public TestProducer(TestClerk clerk){ 7 this.clerk=clerk; 8 } 9 10 11 public void run(){ 12 System.out.println("生产者开始生产商品...."); 13 for(int i=1;i<=10;i++){ 14 try{ 15 Thread.sleep((int)(Math.random()*3000)); 16 }catch(InterruptedException e){ 17 System.out.println(e.getMessage()); 18 } 19 clerk.setProduct(i); 20 } 21 } 22 23 }
TestConsumer.java
View Code
1 View Code 2 3 public class TestConsumer extends Thread{ 4 private TestClerk clerk; 5 6 public TestConsumer(TestClerk clerk){ 7 this.clerk=clerk; 8 } 9 public void run(){ 10 System.out.println("消费者开始消费商品...."); 11 for(int i=1;i<=10;i++){ 12 try{ 13 Thread.sleep((int)(Math.random()*3000)); 14 }catch(InterruptedException e){ 15 e.printStackTrace(); 16 } 17 clerk.getProduct(); 18 } 19 } 20 }
作者:coffeescript
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

浙公网安备 33010602011771号