Java-linux下如何判定线程已经僵死?

发布于 2016-10-31 01:15:44 字数 635 浏览 1293 评论 2

在linux下我起了代码相同的两个线程,运行了一天左右发现其中一个已经不工作,就是在程序中我怎么判定线程已经僵死?我之前是这样做的,起了个监听线程判断线程状态,如果线程挂点我就新起一个线程代替之前的,可是发现没用,因为线程不工作不等于线程已经挂掉,真不知道如何解决,求大神们赐教!监听线程的代码如下:

private void listenTaskStatus() {
for (int i = 0; i < trds.length; i++) {
Thread rb = trds[i];
if (rb.isAlive() == false) {
logger.warn("^^^^^^^^^^^^^^^" + rb.getName()
+ "线程死掉^^^^^^^^^^^^^^^^");
Thread th = new Thread(new TaskConsumer(taskQueue));
trds[i] = th;
trds[i].start();
}
}
}

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

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

发布评论

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

评论(2

灵芸 2017-07-27 20:50:47

不知道java是用的什么线程库,我说下linux的pthread线程库,检测线程是否还活着的方法。

在线程里创建信号处理代码,在信号处理函数里对发送过来的信号进行判别。例如:signal(sig_id , sig_handler) , 如果 sig_id 为 自定义的alive值,则直接返回0,如果是其他的,则对应做相应的处理。

监听线程中,定期对该线程进行alive检测,调用 pthread_kill(pthread_t thread, int sig) 可以向指定ID的线程发送sig信号(sig使用自定义值)。

那么,如果pthread_kill的返回值:

0:线程仍然活着

ESRCH:线程已不存在

EINVAL:信号不合法

想挽留 2016-11-29 07:43:17

这种情况下首先 kill -3 {pid}看一下线程状态。我觉得最有可能的是, 你的“僵死”的线程实际上 在请求一个 已经被占用的锁,所以一直阻塞。 你看看线程 是不是被block住了,具体方法可以参见:
http://architects.dzone.com/articles/how-analyze-java-thread-dumps

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