代码改变世界

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 }