在非常古老的日子里,曾经有一种方法可以"停止"或"杀死"线程,尽管这种方法已经被弃用,因为它允许系统不稳定.不过我注意到,有可能"取消"一个正在运行的future .这里有引号,因为我不知道如何在操作系统级别处理线程.

就我的教育而言,取消future 、有效地取消线程和停止线程之间有什么区别?为什么取消是可以的,但在过go 停止/杀死一个线程是不好的?

推荐答案

取消告诉future 它的结果不再是期望的(如果它还没有完成),并让它干净地停止,而不是线程.stop()终止底层本机线程并释放其所有监视器.线程没有机会结束它正在做的事情,或者将任何东西置于已知的良好状态.

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

这就像是在一场汽车比赛中把红旗放出来,告诉赛车在下一圈需要进入停车场,而突然在赛车前面的一条跑道中间放了一堵墙,然后撞到了车内.

Java相关问答推荐

Cosmos Change Feed Process Lag远远超过收集中的记录数量

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

无法找到符号错误—Java—封装

方法没有用正确的值填充数组—而是将数组保留为null,'

如何调用Firebase Realtime Database中的子图像列表到android studio中的回收器视图?

Java 21虚拟线程执行器的性能比池化操作系统线程的执行器差?

AssertJ Java:多条件断言

将java.util.Date转换为OffsetDateTime

无法在Java中处理PayPal支付响应

类型集合的Jackson JsonNode:类型引用的对象读取器应该是Singleton吗?

如何仅使用键/ID的一部分(组合)高效地返回映射值?

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

有效的公式或值列表必须少于或等于255个字符

如何通过Java java.lang.Foreign API访问本机字节数组

我该如何为我的类编写getter和setter方法?

Java HashMap保留所有时间复杂性

如何在Spring Boot中为不同的部署环境管理多个.properties文件?

如何使用带有可选参数的类生成器?

如何在JSP中从select中获取值并将其放入另一个select

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?