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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马林贺 中级黑马   /  2012-5-30 18:09  /  3089 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. <FONT color=red size=5>//在生产者,消费者的基础上加了守护线程,但是当mian 方法结束后 守护线程还要执行一段时间才能停止。
  2. </FONT>//定义共享类
  3. class Share {
  4. private int sum = 0;
  5. private String name;
  6. boolean boolea = false;
  7. // 创建锁。
  8. Lock lock = new ReentrantLock();
  9. Condition conditio = lock.newCondition();
  10. Condition conditio1 = lock.newCondition();

  11. // 定义生产方法
  12. public void Shengchan() throws InterruptedException {

  13. lock.lock();
  14. try {
  15. while (boolea)
  16. conditio.await();
  17. this.name = "商品" + sum++;
  18. System.out.println(Thread.currentThread().getName()
  19. + "生产者..............." + name);
  20. boolea = true;
  21. conditio1.signal();
  22. } finally {
  23. lock.unlock();
  24. }
  25. }

  26. // 定义消费方法
  27. public void Xiaofei() throws InterruptedException {
  28. lock.lock();

  29. try {
  30. while (!boolea)
  31. conditio1.await();
  32. System.out.println(Thread.currentThread().getName() + "消费者......"
  33. + this.name);
  34. boolea = false;
  35. conditio.signal();
  36. /*
  37. * if ("商品100".equals(this.name)) System.exit(0);
  38. */
  39. } finally {
  40. lock.unlock();
  41. }
  42. }

  43. }

  44. // 定义生产线程
  45. class Shengchan implements Runnable {
  46. Share are;

  47. Shengchan(Share are) {

  48. this.are = are;
  49. }

  50. boolean lean = true;
  51. //覆写run 方法
  52. public void run() {
  53. while (lean)
  54. try {
  55. are.Shengchan();
  56. } catch (InterruptedException e) {
  57. //System.out.println("我是异常偶1");
  58. //lean = false;

  59. }
  60. }
  61. }

  62. class Xiaofei implements Runnable {
  63. Share are;

  64. Xiaofei(Share are) {
  65. this.are = are;
  66. }

  67. boolean lean = true;
  68. //覆写run 方法
  69. public void run() {
  70. while (lean)
  71. try {
  72. are.Xiaofei();
  73. } catch (InterruptedException e) {
  74. //System.out.println("我是异常偶2");
  75. //lean = false;
  76. }
  77. }
  78. }

  79. class Synch2 {

  80. public static void main(String[] args) {
  81. //创建共享类对象
  82. Share are = new Share();
  83. //创建生产对象,传入共享对象
  84. Shengchan chan = new Shengchan(are);
  85. //创建消费对象,传入共享对象
  86. Xiaofei xiao = new Xiaofei(are);
  87. //创建线程
  88. Thread t1 = new Thread(chan);
  89. Thread t2 = new Thread(chan);
  90. Thread t3 = new Thread(xiao);
  91. Thread t4 = new Thread(xiao);
  92. //声明是守护线程
  93. t1.setDaemon(true);
  94. t2.setDaemon(true);
  95. t3.setDaemon(true);
  96. t4.setDaemon(true);
  97. //启动线程
  98. t1.start();
  99. t2.start();
  100. t3.start();
  101. t4.start();
  102. int i = 0;
  103. //main 方法結束
  104. while (true) {
  105. if (i == 100) {
  106. break;
  107. }
  108. i++;
  109. System.out.println(Thread.currentThread().getName()
  110. + ".....我是main......." + i);
  111. }

  112. }

  113. }
复制代码

jietu.jpg (85.27 KB, 下载次数: 105)

截图

截图

12 个回复

正序浏览
袁錦泰 发表于 2012-5-30 23:22
这就奇怪了,为什么我的电脑运行就没有问题. 你加我QQ 826288180 把你代码发给我. ...

添加你好友了,你通过以下
回复 使用道具 举报
马林贺 发表于 2012-5-30 23:14
i  等于 1 的时候  运行的结果

这就奇怪了,为什么我的电脑运行就没有问题. 你加我QQ 826288180 把你代码发给我.
回复 使用道具 举报
袁錦泰 发表于 2012-5-30 23:07
这就是在我这里运行的结果,你把数值范围定义小一点,把所有结果贴上让我看看.这种东西不可能因为计算机的不 ...

i  等于 1 的时候  运行的结果

QQ截图20120530231100.jpg (92.08 KB, 下载次数: 85)

QQ截图20120530231100.jpg
回复 使用道具 举报
  1. Thread-0生产者...............商品0
  2. main.....我是main.......1
  3. main.....我是main.......2
  4. main.....我是main.......3
  5. main.....我是main.......4
  6. main.....我是main.......5
  7. main.....我是main.......6
  8. main.....我是main.......7
  9. main.....我是main.......8
  10. main.....我是main.......9
  11. main.....我是main.......10
  12. main.....我是main.......11
  13. main.....我是main.......12
  14. main.....我是main.......13
  15. main.....我是main.......14
  16. main.....我是main.......15
  17. main.....我是main.......16
  18. main.....我是main.......17
  19. main.....我是main.......18
  20. main.....我是main.......19
  21. main.....我是main.......20
  22. main.....我是main.......21
  23. main.....我是main.......22
  24. main.....我是main.......23
  25. main.....我是main.......24
  26. main.....我是main.......25
  27. main.....我是main.......26
  28. main.....我是main.......27
  29. main.....我是main.......28
  30. main.....我是main.......29
  31. main.....我是main.......30
  32. main.....我是main.......31
  33. main.....我是main.......32
  34. main.....我是main.......33
  35. main.....我是main.......34
  36. main.....我是main.......35
  37. main.....我是main.......36
  38. main.....我是main.......37
  39. main.....我是main.......38
  40. main.....我是main.......39
  41. main.....我是main.......40
  42. main.....我是main.......41
  43. main.....我是main.......42
  44. main.....我是main.......43
  45. main.....我是main.......44
  46. main.....我是main.......45
  47. main.....我是main.......46
  48. main.....我是main.......47
  49. main.....我是main.......48
  50. main.....我是main.......49
  51. main.....我是main.......50
  52. main.....我是main.......51
  53. main.....我是main.......52
  54. main.....我是main.......53
  55. main.....我是main.......54
  56. main.....我是main.......55
  57. main.....我是main.......56
  58. main.....我是main.......57
  59. main.....我是main.......58
  60. main.....我是main.......59
  61. main.....我是main.......60
  62. main.....我是main.......61
  63. main.....我是main.......62
  64. main.....我是main.......63
  65. main.....我是main.......64
  66. main.....我是main.......65
  67. main.....我是main.......66
  68. main.....我是main.......67
  69. main.....我是main.......68
  70. main.....我是main.......69
  71. main.....我是main.......70
  72. main.....我是main.......71
  73. main.....我是main.......72
  74. main.....我是main.......73
  75. main.....我是main.......74
  76. main.....我是main.......75
  77. main.....我是main.......76
  78. main.....我是main.......77
  79. main.....我是main.......78
  80. main.....我是main.......79
  81. main.....我是main.......80
  82. main.....我是main.......81
  83. main.....我是main.......82
  84. main.....我是main.......83
  85. main.....我是main.......84
  86. main.....我是main.......85
  87. main.....我是main.......86
  88. main.....我是main.......87
  89. main.....我是main.......88
  90. main.....我是main.......89
  91. main.....我是main.......90
  92. main.....我是main.......91
  93. main.....我是main.......92
  94. main.....我是main.......93
  95. main.....我是main.......94
  96. main.....我是main.......95
  97. main.....我是main.......96
  98. main.....我是main.......97
  99. main.....我是main.......98
  100. main.....我是main.......99
  101. main.....我是main.......100
复制代码
这就是在我这里运行的结果,你把数值范围定义小一点,把所有结果贴上让我看看.这种东西不可能因为计算机的不同有不同的结果.
回复 使用道具 举报
袁錦泰 黑马帝 2012-5-30 23:03:40
9#
马林贺 发表于 2012-5-30 22:44
那你在仔细的帮我看下,是不是我哪里有写错的地方了,我测试了半天  搞不定了,才求助一下论坛吧 ...

我刚看了一下,你的程序有错误,但是和你的问题没有关系,你的程序我没有做任何改动在我的电脑上运行时main线程结束后守护线程并没有运行,和你的结果不同.
回复 使用道具 举报
袁錦泰 发表于 2012-5-30 22:43
那就奇怪了,我把你的程序放在我的电脑上不运行,理论上一定会随着非守护线程的结束而结束,如果你没有结束的 ...

   那你在仔细的帮我看下,是不是我哪里有写错的地方了,我测试了半天  搞不定了,才求助一下论坛吧
回复 使用道具 举报
袁錦泰 黑马帝 2012-5-30 22:43:08
7#
那就奇怪了,我把你的程序放在我的电脑上不运行,理论上一定会随着非守护线程的结束而结束,如果你没有结束的话那肯定除了main线程以外还有非守护线程存在.我要看看你代码写得有没有问题.我自己写了一个程序运行没有问题,main线程结束后守护线程根本没有运行.
回复 使用道具 举报
你那里i的取值范围是100,打印结果中值打印到10,main线程结束了?

点评

没有,我哪会看输出的结构太长了,就把i 改成了10, 嘿嘿 哪会忘记改了  发表于 2012-5-30 22:35
回复 使用道具 举报
你代码的具体问题是什么? 为什么守护线程没有随着用户线程的结束而结束?

点评

嗯 是的,主线程已经结束了,但是守护线程还在运行  发表于 2012-5-30 22:26
回复 使用道具 举报
谁能解释一下守护线程的问题啊。
回复 使用道具 举报
求高人解释。
回复 使用道具 举报
  请高人指教!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马