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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Goods
  2. {
  3. private String name;
  4. private int count = 0;
  5. private boolean flag = false;

  6. public synchronized void set(String name)
  7. {
  8. while(flag)//线程被唤醒的时候都进一次判断,如用if只能判断一次
  9. try{wait();}catch(Exception e){} //此处只做简单处理,会抛出interrupt异常,暂时不会处理
  10. this.name = name + "--" + count++;
  11. System.out.println(Thread.currentThread().getName() + "....生产者" + this.name);
  12. flag = true;
  13. notifyAll();//唤醒线程池里的线程
  14. }
  15. public synchronized void out()
  16. {
  17. while(!flag)
  18. try{wait();}catch(Exception e){}
  19. System.out.println(Thread.currentThread().getName() + "-------------消费者" + this.name);
  20. flag = false;
  21. notifyAll();
  22. }
  23. }

  24. class Producer implements Runnable
  25. {
  26. private Goods g;
  27. public Producer(Goods g)
  28. {
  29. this.g = g;
  30. }

  31. public void run()
  32. {
  33. while(true)
  34. {
  35. g.set("##商品##");
  36. }
  37. }
  38. }

  39. class Consumer implements Runnable
  40. {
  41. private Goods g;
  42. public Consumer(Goods g)
  43. {
  44. this.g = g;
  45. }
  46. public void run()
  47. {
  48. while(true)
  49. {
  50. g.out();
  51. }
  52. }
  53. }
复制代码
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Goods g = new Goods();
  6.                 Producer pro = new Producer(g);
  7.                 Consumer consumer = new Consumer(g);
  8. //4个生产,2个消费
  9.                 new Thread(pro).start();
  10.                 new Thread(pro).start();
  11.                 new Thread(pro).start();
  12.                 new Thread(pro).start();
  13.                 new Thread(consumer).start();
  14.                 new Thread(consumer).start();
  15.         }
  16. }
复制代码
1.关于wait()使用while循环,因为线程在这被唤醒之后,需要第一时间判断所操作资源的状态,所以只能使用while来强制线程被唤醒就进判断
2.关于notifyAll(),因为正常循环中是生产的完成动作后唤醒消费的线程,但是现有机制下无法唤醒指定的线程,所以运行中容易造成唤醒的是同一边的线程,然后全部线程进入wait()状态,因此,唤醒全部线程是比较行之有效的方法。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马