黑马程序员技术交流社区

标题: java ——守护线程问题 [打印本页]

作者: 马林贺    时间: 2012-5-30 18:09
标题: java ——守护线程问题
  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, 下载次数: 131)

截图

截图

作者: 马林贺    时间: 2012-5-30 18:32
  请高人指教!
作者: 马林贺    时间: 2012-5-30 20:02
求高人解释。
作者: 马林贺    时间: 2012-5-30 21:14
谁能解释一下守护线程的问题啊。
作者: 袁錦泰    时间: 2012-5-30 22:20
你代码的具体问题是什么? 为什么守护线程没有随着用户线程的结束而结束?
作者: 袁錦泰    时间: 2012-5-30 22:29
你那里i的取值范围是100,打印结果中值打印到10,main线程结束了?
作者: 袁錦泰    时间: 2012-5-30 22:43
那就奇怪了,我把你的程序放在我的电脑上不运行,理论上一定会随着非守护线程的结束而结束,如果你没有结束的话那肯定除了main线程以外还有非守护线程存在.我要看看你代码写得有没有问题.我自己写了一个程序运行没有问题,main线程结束后守护线程根本没有运行.
作者: 马林贺    时间: 2012-5-30 22:44
袁錦泰 发表于 2012-5-30 22:43
那就奇怪了,我把你的程序放在我的电脑上不运行,理论上一定会随着非守护线程的结束而结束,如果你没有结束的 ...

   那你在仔细的帮我看下,是不是我哪里有写错的地方了,我测试了半天  搞不定了,才求助一下论坛吧
作者: 袁錦泰    时间: 2012-5-30 23:03
马林贺 发表于 2012-5-30 22:44
那你在仔细的帮我看下,是不是我哪里有写错的地方了,我测试了半天  搞不定了,才求助一下论坛吧 ...

我刚看了一下,你的程序有错误,但是和你的问题没有关系,你的程序我没有做任何改动在我的电脑上运行时main线程结束后守护线程并没有运行,和你的结果不同.
作者: 袁錦泰    时间: 2012-5-30 23:07
  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:14
袁錦泰 发表于 2012-5-30 23:07
这就是在我这里运行的结果,你把数值范围定义小一点,把所有结果贴上让我看看.这种东西不可能因为计算机的不 ...

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

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

QQ截图20120530231100.jpg

作者: 袁錦泰    时间: 2012-5-30 23:22
马林贺 发表于 2012-5-30 23:14
i  等于 1 的时候  运行的结果

这就奇怪了,为什么我的电脑运行就没有问题. 你加我QQ 826288180 把你代码发给我.
作者: 马林贺    时间: 2012-5-31 09:38
袁錦泰 发表于 2012-5-30 23:22
这就奇怪了,为什么我的电脑运行就没有问题. 你加我QQ 826288180 把你代码发给我. ...

添加你好友了,你通过以下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2