posts - 66,comments - 41,trackbacks - 0

复习多线程,一个经典的实例:生产者消费者问题:

1.number表示产品编号,flag表示现在应该由谁来操作.

2.ProcuctData类中有两个同步方法setNumber()和getNumber(),分别代表生产者生产产品和消费者消费 产品。

3.两个线程类Producer和Consumer分别代表生产者与消费者

Java代码
  1. package cn.luxsoft.javafirststep.Thread;  
  2.   
  3. class ProductData {  
  4.   
  5.     // 产品编号  
  6.     private int number;  
  7.   
  8.     // 标记位  
  9.     private boolean flag = true;  
  10.   
  11.     public synchronized void setNumber(int number) {  
  12.         if (!flag) {  
  13.             try {  
  14.                 // 末消费等待  
  15.                 wait();  
  16.             } catch (InterruptedException e) {  
  17.                 e.printStackTrace();  
  18.             }  
  19.         }  
  20.         this.number = number;  
  21.   
  22.         // 标记已经产生  
  23.         flag = false;  
  24.   
  25.         // 通知消费者已经生产,可以消费  
  26.         notify();  
  27.     }  
  28.   
  29.     public synchronized int getNumber() {  
  30.         if (flag) {  
  31.             try {  
  32.                 // 未生产等待  
  33.                 wait();  
  34.             } catch (InterruptedException e) {  
  35.                 e.printStackTrace();  
  36.             }  
  37.         }  
  38.   
  39.         // 标记已消费  
  40.         flag = true;  
  41.   
  42.         // 通知需要生产  
  43.         notify();  
  44.         return this.number;  
  45.     }  
  46. }  
  47.   
  48. class Procucer extends Thread {  
  49.     private ProductData s;  
  50.   
  51.     Procucer(ProductData s) {  
  52.         this.s = s;  
  53.     }  
  54.   
  55.     @Override  
  56.     public void run() {  
  57.         for (int i = 0; i < 10; i++) {  
  58.             s.setNumber(i);  
  59.             System.out.println("P[" + i + "]生产.");  
  60.         }  
  61.     }  
  62. }  
  63.   
  64. class Consumer extends Thread {  
  65.     private ProductData s;  
  66.   
  67.     Consumer(ProductData s) {  
  68.         this.s = s;  
  69.     }  
  70.   
  71.     public void run() {  
  72.         int i;  
  73.   
  74.         do {  
  75.             i = s.getNumber();  
  76.             System.out.println("P[" + i + "]消费.**");  
  77.         } while (i != 9);  
  78.     }  
  79. }  
  80.   
  81. public class ProducerConsumer {  
  82.   
  83.     /** 
  84.      * @param args 
  85.      */  
  86.   
  87.     public static void main(String[] args) {  
  88.   
  89.         ProductData s = new ProductData();  
  90.         Thread producer = new Procucer(s);  
  91.         Thread consumer = new Consumer(s);  
  92.   
  93.         producer.start();  
  94.         consumer.start();  
  95.     }  
  96.   
  97. }  

文章来源:http://www.my1984.net/?action=show&id=177

MSN:
posted on 2009-03-08 17:12 kylixlu 阅读(777) 评论(0)  编辑  收藏 所属分类: J2SE

只有注册用户登录后才能发表评论。


网站导航: