请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Future的cancel

Future的cancel方法真的能终止正在运行的线程?我用一个简单的demo发现并不能终止

正在回答 回答被采纳积分+3

2回答

提问者 思绪纷繁 2020-02-22 19:52:48

我看了你那段讲解,因为之前在项目组的时候有人对这个提出了质疑,cancel只是发一个终端标记。最简单的例子就是主线程中起个子线程,子线程中是个死循环运行,在主线程中拿到子线程的future,然后执行cancel,你发现子线程并不能终止,还是在运行

0 回复 有任何疑惑可以回复我~
  • 悟空 #1
    子线程需要具备响应中断的能力。
    回复 有任何疑惑可以回复我~ 2020-02-22 21:09:33
  • 提问者 思绪纷繁 #2
    我可不可以这样理解在子线程有判断是否子线程收到中断响应,如果收到,子线程运行完毕
    回复 有任何疑惑可以回复我~ 2020-02-22 21:14:13
  • 悟空 回复 提问者 思绪纷繁 #3
    是的,对于线程中断和如何正确停止线程,在另外一门并发课有详细介绍哈,浓缩如下:
    1.原理:用interrupt来请求线程停止而不是强制,好处是安全。
    2.三方配合:想停止线程,要请求方、被停止方、子方法被调用方相互配合才行:
    作为被停止方:每次循环中或者适时检查中断信号,并且在可能抛出InterrupedException的地方处理该中断信号;
    请求方:发出中断信号;
    子方法调用方(被线程调用的方法的作者)要注意:优先在方法层面抛出InterrupedException,或者检查到中断信号时,再次设置中断状态;
    3.最后再说错误的方法:stop/suspend已废弃,volatile的boolean无法处理长时间阻塞的情况
    回复 有任何疑惑可以回复我~ 2020-02-22 22:33:17
悟空 2020-02-22 19:48:46

cancel方法传入true会发中断信号,课里讲future方法的时候详细讲解了呀

0 回复 有任何疑惑可以回复我~
  • 提问者 思绪纷繁 #1
    我看了你那段讲解,因为之前在项目组的时候有人对这个提出了质疑,cancel只是发一个终端标记。最简单的例子就是主线程中起个子线程,子线程中是个死循环运行,在主线程中拿到子线程的future,然后执行cancel,你发现子线程并不能终止,还是在运行
    回复 有任何疑惑可以回复我~ 2020-02-22 19:59:27
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信