【发布时间】:2013-03-15 11:51:57
【问题描述】:
我有一个多线程 java 项目,我想添加一个方法 stop() 来停止所有正在运行的线程。问题是这个项目是别人开发的,我不熟悉它是如何实现多线程的。
我所知道的是,一旦项目启动,就会调用许多线程并且它们会永远运行。有没有办法找到所有正在运行的线程并停止它们?我搜索了很多,找到了如何获取正在运行的线程列表:
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
接下来要做什么来停止所有正在运行的线程?
我之所以要停止这些线程,是因为我需要将此项目作为捆绑包部署到 OSGi 容器中。捆绑包启动后,多个线程将永远运行。所以我需要实现一个destroy()方法来停止所有线程来控制bundle的生命周期。
怎么样
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();
}
【问题讨论】:
-
为什么要停止所有线程?如果您都希望停止您的应用程序,那么 System.exit 是正确的选择。
-
不要试图停止所有线程。
Thread的 stop() 已被弃用是有原因的。查看文档:docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#stop() -
@Ankit 因为我需要将此项目作为捆绑包部署到 OSGi 容器。捆绑包启动后,多个线程将永远运行。所以我需要实现一个destroy()方法来停止所有线程来控制bundle的生命周期。
-
你不能使用 OSGi 捆绑停止方法本身。我对 OSGi 不太了解,如果不是很有用,请忽略我的评论。
-
为什么会有永远运行的线程?它们是您创建的线程吗?
标签: java multithreading osgi