Java-linux下如何判定线程已经僵死?
在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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不知道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:信号不合法
这种情况下首先 kill -3 {pid}看一下线程状态。我觉得最有可能的是, 你的“僵死”的线程实际上 在请求一个 已经被占用的锁,所以一直阻塞。 你看看线程 是不是被block住了,具体方法可以参见:
http://architects.dzone.com/articles/how-analyze-java-thread-dumps