Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
我之所以要停止这些线程,是因为我需要将这个项目作为一个捆绑包部署到OSGi容器中。一旦包启动,多个线程将永远运行。因此,我需要实现一个destroy()方法来停止所有线程,以控制包的生命周期。
怎么样
for (Thread t : Thread.getAllStackTraces().keySet())
{ if (t.getState()==Thread.State.RUNNABLE)
t.interrupt();
}
for (Thread t : Thread.getAllStackTraces().keySet())
{ if (t.getState()==Thread.State.RUNNABLE)
t.stop();
}
这是个危险的想法。thread.stop()
的Javadoc解释:
这种方法本质上是不安全的。停止带有thread.Stop的线程会导致它解锁所有已锁定的监视器(这是未检查的ThreadDeath异常在堆栈中传播的自然结果)。如果以前受这些监视器保护的任何对象处于不一致的状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。stop的许多用法应该被代码所取代,这些代码只是修改一些变量来指示目标线程应该停止运行。目标线程应该定期检查这个变量,如果变量指示它将停止运行,则以有序的方式从它的run方法返回。如果目标线程等待很长时间(例如在条件变量上),应该使用interrupt方法来中断等待。
从根本上说,线程需要被构建和设计为安全终止,不可能安全地杀死任意线程。一个相当标准的模式是这样实现的:
public abstract class StoppableRunnable implements Runnable {
private volatile boolean stopWork;
private boolean done;
public final void run() {
setup();
while(!stopWork && !done) {
doUnitOfWork();
}
cleanup();
}
/**
* Safely instructs this thread to stop working,
* letting it finish it's current unit of work,
* then doing any necessary cleanup and terminating
* the thread. Notice that this does not guarentee
* the thread will stop, as doUnitOfWork() could
* block if not properly implemented.
*/
public void stop() {
stopWork = true;
}
protected void done() {
done = true;
}
protected void setup() { }
protected void cleanup() { }
/**
* Does as small a unit of work as can be defined
* for this thread. Once there is no more work to
* be done, done() should be called.
*/
protected abstract void doUnitOfWork();
}
关于你提出的中断然后停止的建议:
这里仍然存在很多问题,特别是中断并不能保证线程立即中断(它的工作原理与我的stoppableRunnable
类似,尽管不太明确),而是设置了一个标记,表示线程应该在可能的情况下中断。这意味着您可以调用thread.interrupt()
,线程可以启动正确的中断处理行为,然后在此过程中,您对thread.stop()
的调用触发,这将严重地杀死线程,并可能破坏您的JVM。对thread.interrupt()
的调用不能保证线程何时或如何响应该中断,这就是为什么我更喜欢stoppableRunnable
中的显式行为。不用说,如果要调用thread.stop()
,那么首先调用thread.interrupt()
不会有什么好处。我不推荐它,但您最好首先调用thread.stop()
。
此外,要认识到运行循环的代码本身就在一个线程中--这意味着循环很可能首先杀死自己,让所有其他线程运行。
问题内容: 我有一个多线程的Java项目,我想添加一个方法stop()来停止所有正在运行的线程。问题在于该项目是由其他人开发的,而我不熟悉它如何实现多个线程。 我知道的是,一旦项目开始,就会调用许多线程,并且它们将永远运行。有没有办法找到所有正在运行的线程并停止它们?我进行了很多搜索,找到了如何获取正在运行的线程的列表: 接下来要停止所有正在运行的线程该怎么办? 我想停止这些线程的原因是,我需要将
问题内容: 我从Linux Shell 连接到。我时不时地运行一个太大的查询。它可以打印,我已经知道这不是我的意思。我想停止查询。 击中(几次)会完全杀死并把我带回外壳,因此我必须重新连接。 是否可以在不杀死自己的情况下停止查询? 问题答案:
问题内容: 如何以编程方式停止正在运行的mysql查询? 我面临的问题是查询是使用用户提供的数据构造的,并且偶尔可能需要很长时间才能执行(大型表15-3000万行)。我想为用户提供一个cancel- option,但不知道如何停止当前正在执行的mysql-query。 该应用程序是Java applet- servlet:用户在applet中指定条件,该条件将传递给servlet,在servlet
问题内容: 简要描述;简介 将测试服务器重置为已知状态会导致我的测试失败,因为重置服务器时DataTables实例启动的Ajax请求正在进行中。我想通过在重置服务器之前停止DataTables请求来防止这种情况。 详细说明 我有一个在某些页面上使用DataTables的应用程序。这些数据表均执行服务器端查询以填充其表。 当我执行系统测试时,有时会发生争用情况: 测试运行程序启动测试服务器。 测试运
问题内容: 这是执行程序类的方法: 在这里,它等待第二秒,但是当我运行代码时,它将引发异常: 我无法关闭中的并发线程破坏。这是我的代码流: 用Java执行程序类创建一个新线程来运行某些任务,即用 等待10秒以完成任务。 如果任务已完成,则可运行线程也将终止。 如果任务未在10秒内完成,则类应终止线程。 除了在最后一个场景中终止任务以外,其他所有操作都正常。我该怎么办? 问题答案: 该方法只是防止其
问题内容: 我正在尝试制作一个简单的计时器,该计时器在指定的秒数后发出提示音。我设法使其正常工作,但是TimerTask在蜂鸣声后继续运行。现在我停止执行吗?这是我的代码: 问题答案: 您需要通过调用以下方法来取消计时器 这将取消任务,因此可以执行以下操作: