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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xu6148152 中级黑马   /  2014-1-17 20:38  /  1305 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Ticket extends Thread
  2. {
  3.         private static int tick=100;
  4.         public void run()
  5.         {
  6.                 while(true)
  7.                 {
  8.                         if(tick>0)
  9.                         System.out.println(currentThread().getName()+" sale: "+tick--);
  10.                         else
  11.                                 break;
  12.                         
  13.                 }
  14.         }
  15. }
  16. class TicketDemo {
  17.         public static void main(String[] args)
  18.         {
  19.                 Ticket t1=new Ticket();
  20.                 Ticket t2=new Ticket();
  21.                 Ticket t3=new Ticket();
  22.                 Ticket t4=new Ticket();
  23.                
  24.                 t1.start();
  25.                 t2.start();
  26.                 t3.start();
  27.                 t4.start();
  28.         }

  29. }
复制代码
结果会出现两个100。从原理上讲,这不应该啊。tick改成99就没问题了。

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

15 个回复

正序浏览
张志明 发表于 2014-1-17 21:45
就因为是共享数据,才会出现,有的线程抢到数据(100),还没有处理,就被别人抢走了,抢走后拿到没处理 ...

是啊。没错。但是为什么只有100出现(我的电脑上面),线程异步不会发生在别的数上面吗?
回复 使用道具 举报
xu6148152 发表于 2014-1-17 21:29
我知道加synchronized可以同步。也知道这是多线程的隐患。而且单独运行也不会是4个100,注意看我的ticket ...

就因为是共享数据,才会出现,有的线程抢到数据(100),还没有处理,就被别人抢走了,抢走后拿到没处理的数据(100),进行处理,并且打印。等到第一个线程有夺回cpu的时候,运行处理,并且打印。结果就变成打印相同数据100了
回复 使用道具 举报
老毕说的:你的电脑不适合在地球,你速回火星吧。
回复 使用道具 举报
本帖最后由 xu6148152 于 2014-1-17 21:34 编辑
张志明 发表于 2014-1-17 21:31
建议尽量使用Runnable实现接口;
1适合多个相同的程序代码的线程去处理同一个资源,
2可以避免java中的单继 ...

我这个只是测试代码,当然也有解决方案。只是觉得很好奇。而且我试了几次改成99就没出现重复的。而且,我这边的测试,只有100会出现两次,别的都不会。这有点说不通啊。就算是线程异步,那也不应该只发生在100身上。
回复 使用道具 举报
建议尽量使用Runnable实现接口;
1适合多个相同的程序代码的线程去处理同一个资源,
2可以避免java中的单继承的限制
3,增加程序的健壮性,代吗可以被多个线程共享,代码和数据独立。
回复 使用道具 举报
本帖最后由 xu6148152 于 2014-1-17 21:32 编辑
张志明 发表于 2014-1-17 21:25
我说明了,线程的异步并发,这四个线程在并发进行,相互抢占cpu资源进行打印。所以有些syso并没有打印出 ...

我知道加synchronized可以同步。也知道这是多线程的隐患。而且单独运行也不会是4个100,注意看我的ticket是static的。证明它是共享数据。当然了,确实可能存在线程中断的问题。
回复 使用道具 举报
有时候运行环境也是个问题,可能一个重启下eclipse就解决了,你等的,所以,有时候问题很简单,有时候问题很复杂。
回复 使用道具 举报
xu6148152 发表于 2014-1-17 21:10
仔细看我的01,07行

我说明了,线程的异步并发,这四个线程在并发进行,相互抢占cpu资源进行打印。所以有些syso并没有打印出来,而且运行的时间因为抢占,被暂时挂起,进入等待状态。如果单独运行的话,应该有四个100。你看我的运行结果,还存在两个7呢。都是因为线程的异步。你可以加线程锁synchronized使其同步。
回复 使用道具 举报
七录斋 发表于 2014-1-17 21:19
我把你代码运行了多遍就是没有两个100,你换个环境再运行下。

但事实上确实出现了。就算只出现一次。也证明可能有bug(机器或者代码)
回复 使用道具 举报
我把你代码运行了多遍就是没有两个100,你换个环境再运行下。
回复 使用道具 举报
张志明 发表于 2014-1-17 21:05
结果为四个线程在相互抢占cpu资源。没有出现两个100。
线程0123相互抢占打印。线程的异步,并发
...
仔细看我的01,07行
  1. Thread-0 sale: 100
  2. Thread-0 sale: 99
  3. Thread-0 sale: 98
  4. Thread-0 sale: 97
  5. Thread-0 sale: 96
  6. Thread-0 sale: 95
  7. Thread-1 sale: 100
  8. Thread-1 sale: 93
  9. Thread-1 sale: 92
  10. Thread-1 sale: 91
  11. Thread-0 sale: 94
  12. Thread-0 sale: 89
  13. Thread-0 sale: 88
  14. Thread-0 sale: 87
  15. Thread-0 sale: 86
  16. Thread-1 sale: 90
  17. Thread-1 sale: 83
  18. Thread-1 sale: 82
  19. Thread-1 sale: 81
  20. Thread-1 sale: 80
  21. Thread-1 sale: 79
  22. Thread-1 sale: 78
  23. Thread-1 sale: 77
  24. Thread-1 sale: 76
  25. Thread-0 sale: 84
  26. Thread-0 sale: 73
  27. Thread-0 sale: 72
  28. Thread-0 sale: 71
  29. Thread-0 sale: 70
  30. Thread-0 sale: 69
  31. Thread-0 sale: 68
  32. Thread-0 sale: 67
  33. Thread-0 sale: 66
  34. Thread-0 sale: 65
  35. Thread-0 sale: 64
  36. Thread-0 sale: 63
  37. Thread-0 sale: 62
  38. Thread-3 sale: 85
  39. Thread-3 sale: 60
  40. Thread-3 sale: 59
  41. Thread-3 sale: 58
  42. Thread-3 sale: 57
  43. Thread-3 sale: 56
  44. Thread-3 sale: 55
  45. Thread-3 sale: 54
  46. Thread-3 sale: 53
  47. Thread-3 sale: 52
  48. Thread-3 sale: 51
  49. Thread-3 sale: 50
  50. Thread-3 sale: 49
  51. Thread-3 sale: 48
  52. Thread-3 sale: 47
  53. Thread-3 sale: 46
  54. Thread-3 sale: 45
  55. Thread-3 sale: 44
  56. Thread-3 sale: 43
  57. Thread-3 sale: 42
  58. Thread-3 sale: 41
  59. Thread-3 sale: 40
  60. Thread-3 sale: 39
  61. Thread-3 sale: 38
  62. Thread-3 sale: 37
  63. Thread-2 sale: 74
  64. Thread-1 sale: 75
  65. Thread-2 sale: 35
  66. Thread-3 sale: 36
  67. Thread-0 sale: 61
  68. Thread-3 sale: 32
  69. Thread-2 sale: 33
  70. Thread-1 sale: 34
  71. Thread-2 sale: 29
  72. Thread-3 sale: 30
  73. Thread-0 sale: 31
  74. Thread-3 sale: 26
  75. Thread-2 sale: 27
  76. Thread-1 sale: 28
  77. Thread-2 sale: 23
  78. Thread-3 sale: 24
  79. Thread-0 sale: 25
  80. Thread-3 sale: 20
  81. Thread-2 sale: 21
  82. Thread-1 sale: 22
  83. Thread-2 sale: 17
  84. Thread-3 sale: 18
  85. Thread-0 sale: 19
  86. Thread-3 sale: 14
  87. Thread-2 sale: 15
  88. Thread-1 sale: 16
  89. Thread-2 sale: 11
  90. Thread-3 sale: 12
  91. Thread-0 sale: 13
  92. Thread-3 sale: 8
  93. Thread-2 sale: 9
  94. Thread-2 sale: 5
  95. Thread-1 sale: 10
  96. Thread-2 sale: 4
  97. Thread-3 sale: 6
  98. Thread-0 sale: 7
  99. Thread-3 sale: 1
  100. Thread-2 sale: 2
  101. Thread-1 sale: 3
复制代码
回复 使用道具 举报
结果为四个线程在相互抢占cpu资源。没有出现两个100。
线程0123相互抢占打印。线程的异步,并发
  1. Thread-0 sale: 100
  2. Thread-2 sale: 98
  3. Thread-1 sale: 99
  4. Thread-3 sale: 97
  5. Thread-1 sale: 95
  6. Thread-0 sale: 94
  7. Thread-2 sale: 96
  8. Thread-3 sale: 93
  9. Thread-0 sale: 92
  10. Thread-1 sale: 90
  11. Thread-2 sale: 91
  12. Thread-3 sale: 92
  13. Thread-3 sale: 89
  14. Thread-0 sale: 88
  15. Thread-2 sale: 87
  16. Thread-1 sale: 86
  17. Thread-3 sale: 85
  18. Thread-1 sale: 83
  19. Thread-2 sale: 84
  20. Thread-0 sale: 85
  21. Thread-2 sale: 82
  22. Thread-0 sale: 81
  23. Thread-1 sale: 82
  24. Thread-3 sale: 80
  25. Thread-3 sale: 79
  26. Thread-2 sale: 77
  27. Thread-1 sale: 78
  28. Thread-0 sale: 79
  29. Thread-1 sale: 76
  30. Thread-3 sale: 74
  31. Thread-0 sale: 75
  32. Thread-2 sale: 76
  33. Thread-0 sale: 73
  34. Thread-2 sale: 72
  35. Thread-1 sale: 71
  36. Thread-3 sale: 70
  37. Thread-1 sale: 69
  38. Thread-2 sale: 68
  39. Thread-0 sale: 67
  40. Thread-3 sale: 66
  41. Thread-0 sale: 65
  42. Thread-2 sale: 64
  43. Thread-1 sale: 63
  44. Thread-3 sale: 62
  45. Thread-1 sale: 61
  46. Thread-3 sale: 59
  47. Thread-0 sale: 60
  48. Thread-2 sale: 61
  49. Thread-3 sale: 58
  50. Thread-2 sale: 57
  51. Thread-0 sale: 56
  52. Thread-1 sale: 55
  53. Thread-2 sale: 54
  54. Thread-1 sale: 52
  55. Thread-0 sale: 53
  56. Thread-3 sale: 54
  57. Thread-1 sale: 51
  58. Thread-3 sale: 49
  59. Thread-2 sale: 50
  60. Thread-0 sale: 51
  61. Thread-2 sale: 48
  62. Thread-1 sale: 47
  63. Thread-0 sale: 46
  64. Thread-3 sale: 45
  65. Thread-2 sale: 44
  66. Thread-1 sale: 43
  67. Thread-0 sale: 42
  68. Thread-3 sale: 41
  69. Thread-1 sale: 40
  70. Thread-2 sale: 39
  71. Thread-0 sale: 38
  72. Thread-3 sale: 37
  73. Thread-1 sale: 36
  74. Thread-2 sale: 36
  75. Thread-0 sale: 35
  76. Thread-3 sale: 34
  77. Thread-2 sale: 33
  78. Thread-1 sale: 33
  79. Thread-3 sale: 32
  80. Thread-0 sale: 31
  81. Thread-1 sale: 30
  82. Thread-2 sale: 29
  83. Thread-3 sale: 28
  84. Thread-0 sale: 27
  85. Thread-1 sale: 26
  86. Thread-2 sale: 26
  87. Thread-3 sale: 25
  88. Thread-0 sale: 24
  89. Thread-2 sale: 23
  90. Thread-1 sale: 22
  91. Thread-0 sale: 21
  92. Thread-3 sale: 20
  93. Thread-2 sale: 19
  94. Thread-1 sale: 18
  95. Thread-0 sale: 17
  96. Thread-3 sale: 16
  97. Thread-1 sale: 15
  98. Thread-2 sale: 14
  99. Thread-0 sale: 13
  100. Thread-3 sale: 12
  101. Thread-2 sale: 11
  102. Thread-1 sale: 10
  103. Thread-3 sale: 9
  104. Thread-0 sale: 8
  105. Thread-1 sale: 7
  106. Thread-2 sale: 7
  107. Thread-0 sale: 6
  108. Thread-3 sale: 5
  109. Thread-1 sale: 4
  110. Thread-2 sale: 3
  111. Thread-3 sale: 2
  112. Thread-0 sale: 1
复制代码
回复 使用道具 举报
七录斋 发表于 2014-1-17 20:51
没有两个100啊,你怎么会有这样的结果类?

是啊,其他数字都么问题,就是100出现了两次。难道是电脑的问题?
回复 使用道具 举报
没有两个100啊,你怎么会有这样的结果类?
回复 使用道具 举报
。。。坐等能看出问题的大神。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马