• 线程的中断标志位为true,是不是线程就立即停止?


    前面一篇文章总结了线程中断的几种方式,如果对线程中断机制还不太熟悉的同学,可以参考阅读前面一篇文章:

    如何停止中断运行中的线程?_每天都要进步一点点的博客-CSDN博客

    今天我们看一下这个问题: “线程的中断标志位为true,是不是线程就立即停止?”

    直接看下面的代码:

    1. import java.util.concurrent.TimeUnit;
    2. public class InterruptDemo04 {
    3. public static void main(String[] args) throws InterruptedException {
    4. Thread thread = new Thread(() -> {
    5. for (int i = 0; i < 300; i++) {
    6. System.out.println(i);
    7. }
    8. System.out.println(Thread.currentThread().getName() + "线程调用interrupt()方法后的中断状态02:" + Thread.currentThread().isInterrupted());
    9. }, "t1");
    10. thread.start();
    11. System.out.println(thread.getName() + "线程默认的中断状态:" + thread.isInterrupted());
    12. TimeUnit.MILLISECONDS.sleep(2);
    13. // 主线程请求中断t1线程
    14. // interrupt()并不能真正的停止线程,只是更换了线程中断状态标志位。
    15. thread.interrupt();
    16. // isInterrupted(): 实例方法。测试此线程是否已中断。线程的中断状态不受此方法的影响。(即不会清除线程的中断状态)
    17. System.out.println(thread.getName() + "线程调用interrupt()方法后的中断状态01:" + thread.isInterrupted());
    18. TimeUnit.SECONDS.sleep(3);
    19. // 中断一个不活动的线程,不会产生任何影响。所以输出为false. (3秒后t1线程早就执行完了。)
    20. System.out.println(thread.getName() + "线程调用interrupt()方法后的中断状态03:" + thread.isInterrupted());
    21. }
    22. }

    输出结果: 

    1. t1线程默认的中断状态:false
    2. 0
    3. 1
    4. 2
    5. 3
    6. 4
    7. 5
    8. 6
    9. 7
    10. 8
    11. 9
    12. 10
    13. 11
    14. 12
    15. 13
    16. 14
    17. 15
    18. 16
    19. 17
    20. 18
    21. 19
    22. 20
    23. 21
    24. 22
    25. 23
    26. 24
    27. 25
    28. 26
    29. 27
    30. 28
    31. 29
    32. 30
    33. 31
    34. 32
    35. 33
    36. 34
    37. 35
    38. 36
    39. 37
    40. 38
    41. 39
    42. 40
    43. 41
    44. 42
    45. 43
    46. 44
    47. 45
    48. 46
    49. 47
    50. 48
    51. 49
    52. 50
    53. 51
    54. 52
    55. 53
    56. 54
    57. 55
    58. 56
    59. 57
    60. 58
    61. 59
    62. 60
    63. 61
    64. 62
    65. 63
    66. 64
    67. 65
    68. 66
    69. 67
    70. 68
    71. 69
    72. 70
    73. 71
    74. 72
    75. 73
    76. 74
    77. 75
    78. 76
    79. 77
    80. 78
    81. 79
    82. 80
    83. 81
    84. 82
    85. 83
    86. 84
    87. 85
    88. 86
    89. 87
    90. 88
    91. 89
    92. 90
    93. 91
    94. 92
    95. 93
    96. 94
    97. 95
    98. 96
    99. 97
    100. 98
    101. 99
    102. t1线程调用interrupt()方法后的中断状态01true
    103. 100
    104. 101
    105. 102
    106. 103
    107. 104
    108. 105
    109. 106
    110. 107
    111. 108
    112. 109
    113. 110
    114. 111
    115. 112
    116. 113
    117. 114
    118. 115
    119. 116
    120. 117
    121. 118
    122. 119
    123. 120
    124. 121
    125. 122
    126. 123
    127. 124
    128. 125
    129. 126
    130. 127
    131. 128
    132. 129
    133. 130
    134. 131
    135. 132
    136. 133
    137. 134
    138. 135
    139. 136
    140. 137
    141. 138
    142. 139
    143. 140
    144. 141
    145. 142
    146. 143
    147. 144
    148. 145
    149. 146
    150. 147
    151. 148
    152. 149
    153. 150
    154. 151
    155. 152
    156. 153
    157. 154
    158. 155
    159. 156
    160. 157
    161. 158
    162. 159
    163. 160
    164. 161
    165. 162
    166. 163
    167. 164
    168. 165
    169. 166
    170. 167
    171. 168
    172. 169
    173. 170
    174. 171
    175. 172
    176. 173
    177. 174
    178. 175
    179. 176
    180. 177
    181. 178
    182. 179
    183. 180
    184. 181
    185. 182
    186. 183
    187. 184
    188. 185
    189. 186
    190. 187
    191. 188
    192. 189
    193. 190
    194. 191
    195. 192
    196. 193
    197. 194
    198. 195
    199. 196
    200. 197
    201. 198
    202. 199
    203. 200
    204. 201
    205. 202
    206. 203
    207. 204
    208. 205
    209. 206
    210. 207
    211. 208
    212. 209
    213. 210
    214. 211
    215. 212
    216. 213
    217. 214
    218. 215
    219. 216
    220. 217
    221. 218
    222. 219
    223. 220
    224. 221
    225. 222
    226. 223
    227. 224
    228. 225
    229. 226
    230. 227
    231. 228
    232. 229
    233. 230
    234. 231
    235. 232
    236. 233
    237. 234
    238. 235
    239. 236
    240. 237
    241. 238
    242. 239
    243. 240
    244. 241
    245. 242
    246. 243
    247. 244
    248. 245
    249. 246
    250. 247
    251. 248
    252. 249
    253. 250
    254. 251
    255. 252
    256. 253
    257. 254
    258. 255
    259. 256
    260. 257
    261. 258
    262. 259
    263. 260
    264. 261
    265. 262
    266. 263
    267. 264
    268. 265
    269. 266
    270. 267
    271. 268
    272. 269
    273. 270
    274. 271
    275. 272
    276. 273
    277. 274
    278. 275
    279. 276
    280. 277
    281. 278
    282. 279
    283. 280
    284. 281
    285. 282
    286. 283
    287. 284
    288. 285
    289. 286
    290. 287
    291. 288
    292. 289
    293. 290
    294. 291
    295. 292
    296. 293
    297. 294
    298. 295
    299. 296
    300. 297
    301. 298
    302. 299
    303. t1线程调用interrupt()方法后的中断状态02true
    304. t1线程调用interrupt()方法后的中断状态03false

     通过运行结果,可以总结出以下几点:

    • 1、线程默认的中断标志位为false; 对应输出===> "t1线程默认的中断状态:false"
    • 2、当调用了某个线程的interrupt()方法之后,这个线程并不是立即停止运行线程(如上,输出到99的时候,就打印出来中断标志位为true了,多运行几次,也可能出现t1执行得比较快,看起来像是调用interrupt()方法就立即停止,实际并不是,这一点需要注意。),它只是更换了线程中断状态标志位修改为true; 对应输出===> "t1线程调用interrupt()方法后的中断状态01:true"
    • 3、当调用interrupt()方法后,t1线程没有立即停止运行,而是经过一段时间后,才停止。 对应输出===> "t1线程调用interrupt()方法后的中断状态02:true"
    • 4、中断一个不活动的线程,不会产生任何影响,因为3秒后t1线程早就执行完了。 对应输出===> "t1线程调用interrupt()方法后的中断状态03:false"。
  • 相关阅读:
    图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)
    206.反转链表
    Android绑定式服务
    统计学习方法 支持向量机(下)
    Android学习笔记 1.3 搭建Android开发环境
    三个pwn题
    [R] How to communicate with your data? - ggplot2
    客服开场白话术
    内网渗透-【横向移动】PsExec工具远程命令执行横向移动
    您的移动端app安全吗
  • 原文地址:https://blog.csdn.net/Weixiaohuai/article/details/125443833