本帖最后由 天下 于 2013-12-4 15:49 编辑
哥们,不知道你是指的哪一个例子;
比如:生产者消费者那个例子,循环判断是为了保证不产生数据错乱,
- //如下定义了一个产品类,产品类有自己的属性,然后创建了两个Runnable线
- //程类,一个为生产者Producer和消费者Consumer,这两个类持有了对产品类
- //的引用,可以方法和操作产品类对象的属性,达到生产者在刷新产品的属性,//模仿了产品生产的过程,而消费者便可以取得产品的信息,模仿了产
- //品被消费的过程。
- packagecom.thread;
- public classProducerAndConsumer
- {
- public static void main(String[] args)
- {
- Product p = new Product();
- Producer pr = new Producer(p);
- Consumer cr = new Consumer(p);
- Thread t1 = new Thread(pr);
- Thread t2 = new Thread(pr);
- Thread t3 = new Thread(cr);
- Thread t4 = new Thread(cr);
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- }
- }
- //定一个产品类
- class Product
- {
- private String name;
- private int ID = 1;
- public boolean flag = false;
- public synchronized void setProperty(String name)
- {
- while(flag)
- {
- try
- {
- this.wait();
- }
- catch(Exception e)
- {
- };
- }
- this.name =name+" "+ID++;
- System.out.println(Thread.currentThread().getName()+" 生产出 "+this.name);
- flag = true;
- this.notifyAll();
- }
- public synchronized void getInfo()
- {
- //这里使用Wlile而不是if实用为while会条件会被判断两次,不会到一个产品被//消费两次,或程序挂起的状况。
- while(!flag)
- {
- try
- {
- this.wait();
- }
- catch(Exception e)
- {
- };
- }
- System.out.println(Thread.currentThread().getName()+" 消费了 "+this.name+" o(∩_∩)o...哈哈!!!");
- flag = false;
- //这里notifyAll()是为了防止之唤醒本对列的线程,却没有唤醒对方的线程,最
- //终导致程序都进入wait状态,程序挂起。
- this.notifyAll();
- }
- }
-
- class Producer implements Runnable
- {
- private Product p;
- public Producer(Product p)
- {
- this.p = p;
- }
- @Override
- public void run()
- {
- while(true)
- {
- p.setProperty("糖果");
- }
-
- }
- }
-
- class Consumer implements Runnable
- {
- private Product p ;
- publicConsumer(Product p)
- {
- this.p = p;
- }
- @Override
- public void run()
- {
- while(true)
- {
- p.getInfo();
- }
- }
- }
复制代码
|