Java线程莫名停止
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java线程莫名停止相关的知识,希望对你有一定的参考价值。
我用Java写了一个小爬虫,10 个线程 每个线程遍历100 000个网页, 经常碰到有一两个线程莫名停止(主线程也因为这个原因没有停止)。其他的都正常跑完了, 我想问下这是什么原因,有没有办法唤醒停止的线程
程序的成功都是一样的,失败各有各自的原因,听你描述也不能给什么建设性的建议。不如将代码贴出来,大家共同探讨下。追问已经补充了 代码有点长 但是很简单的爬虫程序
参考技术A 会不会是CPU或者内存溢出追问如果是这样的原因 线程的状态是什么 ? 有没有可能唤醒停止的线程
本回答被提问者采纳如何停止 Java 线程? [复制]
【中文标题】如何停止 Java 线程? [复制]【英文标题】:How to stop a Java thread? [duplicate] 【发布时间】:2012-10-11 08:11:15 【问题描述】:可能重复:How do you kill a thread in Java?How to start/stop/restart a thread in Java?
Thread
具有以下功能:
destroy()
stop()
suspend()
但它们都已被弃用。 你用什么来停止线程?
【问题讨论】:
你不要停止线程,只需让run
方法完成它的执行。
您能否详细说明您为什么要停止线程的用例?
为了完整起见,另一种方法是终止整个过程 - 这将起作用。
在线程外部或线程中的字段上设置一个标志,并在标志变为真时让线程检查。当它发生时,使 run 方法返回。设置标志以使线程自行退出。简单
【参考方案1】:
你应该确保它只是在它应该运行的时候运行/退出。
查看this 以获得解释。
【讨论】:
【参考方案2】:您可以使用布尔标志来停止线程。您也可以使用Thread.isInterrupted() 来检查线程是否被中断并忽略与布尔标志相同的其余工作。
class Worker implements Runnable
private volatile boolean shouldRun = true;
@Override
public void run()
while (shouldRun)
// your code here
public void cancel()
shouldRun = false;
如果您想知道为什么不推荐使用这些功能,可以查看Java Thread Primitive Deprecation
【讨论】:
【参考方案3】:你可以这样做:
private boolean running = true;
public void stop ()
running = false;
public void run ()
while (running)
//your code goes here
这只是让 run-method 消失的简单方法。
【讨论】:
+1 运行需要volatile
否则 run() 可能永远不会停止。【参考方案4】:
你礼貌地请他结束工作。该线程应该表现良好,并且应该在被询问时结束它的工作。
问你使用Thread.interrupt()
,它会抛出InterruptedException
(如果线程正在等待)或在线程中设置一个标志(如果不等待)。
线程应该在捕获InterruptException
时退出它的工作,或者如果它做了很多长时间的工作(没有睡眠/等待),它应该不时检查它是否被中断并退出。
【讨论】:
【参考方案5】:您提到的方法已被弃用,因为一旦使用它们可能会使系统进入不稳定状态:就像杀死进程一样。使用这些方法不会给线程任何优雅退出的机会。
结论是,您正在实现的每个线程都应该有自己的优雅退出机制。通常,您执行以下操作。创建boolean
标志exit
,默认为false
。线程的run()
方法应该实现如下循环:
while (!exit)
// do the job
添加方法exit()
将此标志转换为true
,因此当从线程外部调用该方法时,将在下一次迭代中离开while
循环。您应该在退出时关心关闭资源等。
显然你可以通过发送 sing 来改进机制
【讨论】:
【参考方案6】:任何线程都会运行以完成其工作。它应该确定自己是否还有更多工作要做。当您想停止一个工作线程时,这意味着该线程认为该工作存在,但您不希望该线程执行它。这绝对是您设计中的一个问题。在一个好的设计问题中,不需要停止/恢复线程。
【讨论】:
以上是关于Java线程莫名停止的主要内容,如果未能解决你的问题,请参考以下文章