A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Resource{
  2.         private String name;
  3.         private int count = 1;
  4.         private boolean flag = false;
  5.        
  6.         public synchronized void set(String name) {
  7.                 while(flag){
  8.                         try {
  9.                                 this.wait();
  10.                         } catch (InterruptedException e) {
  11.                                 e.printStackTrace();
  12.                         }
  13.                 }
  14.                 this.name = name+"..."+count++;
  15.                 System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  16.                 flag = true;
  17.                 this.notifyAll();
  18.         }
  19.        
  20.         public synchronized void out(){
  21.                 while(!flag){   //当处于等待状态的线程被唤醒时,应该再进行一次标志的判断,故而将if更换为while
  22.                         try {
  23.                                 this.wait();   
  24.                         } catch (InterruptedException e) {
  25.                                 e.printStackTrace();
  26.                         }
  27.                 }
  28.                 System.out.println(Thread.currentThread().getName()+".....消费者...."+this.name);
  29.                 flag = false;
  30.                 this.notifyAll(); //因为在等待的线程池中,先进入线程池中的会先唤醒,所以需要用notifyAll唤醒所有的线程
  31.         }
  32. }

  33. class Producer implements Runnable{
  34.     private Resource res;
  35.        
  36.     public Producer(Resource res) {
  37.             this.res = res;
  38.         }
  39.         public void run() {
  40.                 while(true){
  41.                         res.set("+商品+");
  42.                 }
  43.         }
  44. }

  45. class Consumer implements Runnable{
  46.         private Resource res;
  47.        
  48.         public Consumer(Resource res) {
  49.                 this.res = res;
  50.         }
  51.        
  52.         public void run() {
  53.                 while(true){
  54.                         res.out();
  55.                 }
  56.         }
  57. }

  58. public class ProducerConsumerDemo {

  59.         public static void main(String[] args) {
  60.                 Resource r = new Resource();
  61.                 /*
  62.                  * 当开启的线程超过两个时,这段代码会出现问题
  63.                  *
  64.                  */
  65.                 //new Thread(new Producer(r)).start(); //代码优化的写法
  66.                 Producer pro = new Producer(r);
  67.                 Consumer con = new Consumer(r);
  68.                
  69.                 Thread t1 = new Thread(pro);
  70.                 Thread t2 = new Thread(pro);
  71.                 Thread t3 = new Thread(con);
  72.                 Thread t4 = new Thread(con);
  73.                
  74.                 t1.start();
  75.                 t2.start();
  76.                 t3.start();
  77.                 t4.start();
  78.         }
  79. }
复制代码


在上边的代码中,类Resource里面有一个while循环,我不是很理解它是怎么结束这个循环的,求大神给指点一下

2 个回复

倒序浏览
结束run方法就可以结束线程。在Consumer和Producer的run方法中,可以定义标记,当标记为假是run方法就结束,或者直接给定循环次数。你写true不好结束的。
回复 使用道具 举报
是通过 flag = false 结束循环的~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马