多线程如何杀死java线程?
我在谷歌上搜索了杀死java线程的解决方案。有两种解决方案:
- 立旗
- 使用线程。打断
但这两种都不适合我。在我的线程中,我调用了一个需要很长时间才能完成的第三方api。我想让用户取消这个线程,如果它需要太多时间
那我怎么才能杀死这根线呢?提前谢谢
你可以在下面搜索框中键入要查询的问题!
我在谷歌上搜索了杀死java线程的解决方案。有两种解决方案:
但这两种都不适合我。在我的线程中,我调用了一个需要很长时间才能完成的第三方api。我想让用户取消这个线程,如果它需要太多时间
那我怎么才能杀死这根线呢?提前谢谢
# 1 楼答案
理论上,您可以调用不推荐使用的
Thread.stop()
方法。但请注意,这可能会导致应用程序以意外和不可预测的方式运行。。。这取决于第三方库实际上在做什么Thread.stop()
和朋友基本上是不安全的最好的解决方案是修改第三方库以响应线程。打断如果你做不到,那就放弃它,找一个更好的图书馆
# 2 楼答案
您可以在Thread对象上调用
stop
方法,但强烈建议您不要这样做您是否有对API进行微小更改的自由?这个阻塞调用是CPU绑定还是IO绑定?如果它是IO绑定的,并且您可以访问底层套接字/远程通信对象,那么关闭该对象可以带来奇迹。至少比停止线程要好
# 3 楼答案
Thread.interrupt()
是唯一普遍适用的安全方法。当然,您可以使用其他应用程序级别的信号(例如对易失性变量的条件检查)来自行终止。其他方法(例如所有不推荐的Thread.xx方法)可能会以不确定的方式污染应用程序的状态,并且需要重新加载所有应用程序状态# 4 楼答案
生成一个单独的进程,并使用操作系统设施杀死它。你必须调用“C”来完成这项工作,但代码不多。你没有说你在运行什么操作系统
# 5 楼答案
你可以试试Thread.stop(),但是at your own risk。最理想的情况是,如果需要,您正在调用的API应该有一种中断操作的方法(这就是Thread.interrupt()的作用,如果API本身没有提供一种更干净的方式来中断其进程,您尝试过吗?)
# 6 楼答案
我会将调用一个需要很长时间的第三方api放入一个
Callable<DataTypeReturnedBy3rdPartAPI>
中,然后用一个指定超时的SingleThreadExecutor
来执行它按照这种方法,如果调用第三方API的时间超过^{,线程将被杀死,下面是一些代码来举例说明我所说的: