Java-java 中止正在运行的线程

发布于 2017-09-23 04:38:03 字数 332 浏览 1244 评论 2

我调用别人的api函数,所以函数不能修改,但是别人的api函数常常会遇到卡死的情况。
我就把它放在一个线程中,如果函数卡死,就退出这个线程。
请问有什么办法强制中止这个线程。
我已经做过很多尝试:
stop被禁止使用,interrupt只能中止阻塞睡眠等待的线程,共享变量需要使用在循环条件里。
请教各位高手,赐教一个方法

2012- 12- 10 结束问题:现在还不能设置最佳答案,就给alimuya。
我最终没有办法就用stop啦,不安全也没有办法,因为这个方向走不通。
但是呢 程序估计运行了 30遍左右会莫名其妙的卡住,但是不在卡在这个地方。谢谢各位高手啦

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜柠檬 2017-10-24 11:50:31

1,我可以告诉你,使用excutor结构的超时设置来解决,我也可以告诉你使用join来解决。但是我不想害了你。作为一个程序员,是要在正确的基础上编写正确的代码,而不是在错误的泥潭里维护错误。如果一个api会卡死,它本应该会提供异常,或者其他超时提示,它没有这么做,说明这是一个十足的垃圾。如果你使用了它,它只会降低你的智商。

2,要终止一个线程,在项目开发中是十分罕见的。即便要终止,你必须有十分充足的现实意义,而这个意义绝对不包括为了解决某个卡死,或者某个bug。当你的出发点是错误的,你会发现java所有的语义都会抛弃你,不在支持你。你什么语法也写不出来

3,终止线程是可以使用stop的。这个无可厚非,但是你必须明白,终止了之后,线程中操作的数据会变成什么样,会造成多少不可预知的影响。

泛泛之交 2017-09-30 08:28:57

我们不说 程序逻辑方面的, 单说怎么去安全的stop一个线程.

在Java的官方说明里:
http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
给出了怎么去安全的 实现 Thread.stop()的功能:
What should I use instead of Thread.stop?

大致说, 你应该发送一个 提示 给需要 stop的线程, 让它自己检查到提示, 自己退出.
参考文档里的代码和你的需求, 给出代码如下:

private volatile Thread blinker;

public void stop() {
blinker = null;
}

public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
Thread.sleep(interval);
} catch (InterruptedException e){
}
//监测 第三方api是否卡死, if(true), break;
}
}

答案补充:
也可以使用Thread.interrupt()方法. 因为我记得ScheduledFuture是可以cancel一个task的. 去看了一下代码,用了interupt()方法:

boolean innerCancel(boolean paramBoolean)
{
while (true)
{
int i = getState();
if (ranOrCancelled(i))
return false;
if (compareAndSetState(i, 4))
break;
}
if (paramBoolean)
{
Thread localThread = this.runner;
if (localThread != null)
localThread.interrupt();
}
releaseShared(0);
FutureTask.this.done();
return true;
}

实际上, interrupt()和上面说的停止线程的机制是类似的. 只是对 要停止线程的一个提醒.
在Oracle文档中, 给出了线程实现支持interrupt的方式:
http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
大致说, 线程在sleep, wait时, 被打断会得到InterruptedException; 否则, 需要定期扫描Thread.interrupted()来知道自己是否被打断, 被作出响应.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文