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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨卓儒 黑马帝   /  2012-7-25 22:01  /  2139 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Lewis 于 2012-7-25 23:20 编辑

        今天总结多线程,在自己写的一个多线程程序中,我想要线程处理客户类100次,但是这个 循环次数 应该定义在哪儿呢? 按理说应该定义在主函数中,便于修改,但是我把循环次数SUM定义在了主函数中后,在线程类中引用SUM则找不到常量,如果在SUM前面加了PUBLIC的话,直接提示非法的开头~~郁闷了。最后我只能定义在客户类中,和计数变量count一样的定义和引用,倒是没问题。但是觉得这样很麻烦。下面是我的程序代码,大家看看我该怎么改,才能保证能让循环次数SUM作为一个常量,保存在主函数中便于修改~
  1. import java.util.concurrent.locks.*;

  2. class Demo
  3. {
  4. public static void main(String[] args)
  5. {

  6. //创建客户对象
  7. Food f = new Food();

  8. //创建两个厨师线程,开始线程
  9. new Thread(new Chef(f)).start();
  10. new Thread(new Chef(f)).start();

  11. //创建两个吃货线程,开始线程
  12. new Thread(new Eater(f)).start();
  13. new Thread(new Eater(f)).start();
  14. }
  15. }

  16. //创建客户类

  17. class Food
  18. {
  19. private String name;
  20. private int count = 1; //计数器
  21. private int SUM = 100; //循环次数
  22. private boolean flag = false;//定义标志,

  23. private Lock lock = new ReentrantLock(); //创建锁

  24. private Condition con_cook = lock.newCondition(); //创建厨师的条件队列
  25. private Condition con_eat = lock.newCondition(); //创建吃货的条件队列

  26. public int getCount()
  27. {
  28. return count;
  29. }

  30. public int getSum()
  31. {
  32. return SUM;
  33. }

  34. //创建厨师类线程的执行函数内容,将其封装起来
  35. public void cook(String name) throws InterruptedException
  36. {
  37. lock.lock();//为线程上锁,此时在解锁之前,cpu的执行权只所属一个线程
  38. try
  39. {
  40. while(flag)
  41. con_cook.await();//使当前厨师线程进入等待状态

  42. this.name = count++ + name;
  43. System.out.println(Thread.currentThread().getName()+"厨子:......第"+this.name+"做好了,快吃吧");
  44. flag = true;
  45. con_eat.signal();//唤醒一个吃货线程
  46. }
  47. finally
  48. {
  49. lock.unlock();//为线程解锁,释放资源
  50. }
  51. }

  52. public void eat() throws InterruptedException
  53. {
  54. lock.lock();//为线程上锁,此时在解锁之前,cpu的执行权只所属一个线程
  55. try
  56. {
  57. while(!flag)
  58. con_eat.await();//使当前吃货线程进入等待状态
  59. System.out.println(Thread.currentThread().getName()+"吃货:......第"+this.name+"吃完了,快做吧");
  60. flag = false;
  61. con_cook.signal();//唤醒一个厨师线程
  62. }
  63. finally
  64. {
  65. lock.unlock();//为线程解锁,释放资源
  66. }
  67. }

  68. }

  69. //定义厨师类,为实现接口型
  70. class Chef implements Runnable
  71. {
  72. private Food f;

  73. Chef(Food f)
  74. {
  75. this.f = f;
  76. }
  77. public void run()
  78. {
  79. while(f.getSum()>f.getCount())
  80. {
  81. try
  82. {
  83. f.cook("盘");
  84. }
  85. catch (InterruptedException e)
  86. {
  87. }
  88. }
  89. }
  90. }

  91. //定义吃货类,为继承Thread类
  92. class Eater extends Thread
  93. {
  94. private Food f;

  95. Eater(Food f)
  96. {
  97. this.f = f;
  98. }
  99. public void run()
  100. {
  101. while(f.getSum()>f.getCount())
  102. {
  103. try
  104. {
  105. while(true)
  106. f.eat();
  107. }
  108. catch (InterruptedException e)
  109. {
  110. }
  111. }
  112. }
  113. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
为什么我打的字有阴影。。。郁闷
回复 使用道具 举报
没人帮忙吗?????顶起 ~~
回复 使用道具 举报
突然想明白了,我这个问题好愚蠢~~定义静态常量应该定义在Demo类中,而不知Main函数中。定义在Demo类中后,在下面的线程类中
直接使用 Demo.SUM 便可引用。

回复 使用道具 举报
帖子挺好, 我带厂里 慢慢看,看看能不能解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马