取消 Future 与停止线程

Woo*_*man 3 java multithreading

在非常古老的日子里,曾经有一种方法可以“停止”或“杀死”线程,尽管由于它导致系统不稳定,这种方法已被弃用。但我注意到,可以“取消”正在运行的未来。之所以有引号,是因为我不知道在操作系统级别如何处理线程。

对于我的教育,取消 Future、有效取消线程和停止线程之间有什么区别?为什么取消可以,但过去停止/杀死线程却不好?

Dav*_*rad 5

取消告诉 Future 不再需要它的结果(如果它尚未完成),并让它干净地停止,而 Thread.stop() 会杀死底层本机线程并释放其所有监视器。线程没有机会结束它正在做的事情或将任何内容置于已知的良好状态。

不同之处在于,一个发送消息,但让收件人按照自己的条件响应消息,而另一个只是立即有效地强制阻止它。(让接收者以自己的方式响应甚至可能意味着作业将继续执行,因为不同的实现Future可能会以不同的方式处理取消,但任何结果仍将被忽略。)

这就像在汽车比赛中亮出红旗,告诉赛车需要在下一圈进站,与突然在赛车正前方的赛道中间放置一堵墙之间的区别,然后它会撞上。