我有多个子线程实例,它们已启动并应继续执行直到应用程序退出。
我有扩展Task的类,我创建了
的线程new Thread(object of the class).start();
所有线程都应在关闭主阶段时终止。
primaryStage.onCloseOperation(){...}
答案 0 :(得分:3)
我从一开始就明确地管理你的线程。特别是,在父类中有一个线程池,如下所示:
ExecutionService exec = Executors.newCachedExecutionService();
然后,如果你的任务是为了继续运行(而不是定期安排),你可以根据中断对你的任务进行编码:
while(!Thread.currentThread().isInterrupted()){
do stuff;
}
这将使任务运行直至中断。在这种情况下,您永远不会忽略InterruptedException
,这一点很重要,因为InterruptedException
将isInterrupted
设置为false时会被抛出。当您看到InterruptedException
:
}catch(InterruptedException e){
Thread.currentThread().interrupt();
return;
}
然后,您可以像这样开始您的子任务:
for(task : tasks){
exec.execute(task);
}
现在,当您的父任务完成时,您只需调用:
exec.shutdownNow();
停止孩子的任务。如果您的子任务使用Thread.currentThread().isInterrupted()
,则必须使用shutdownNow()
(shutdown()
仅在您希望等待任务自行停止时才有效)。
答案 1 :(得分:1)
您应该考虑使用ThreadGroup
对所有线程进行分组,然后控制它们的行为。 Java 5在java.lang.management中添加了ThreadInfo和ThreadMXBean类来获取状态信息。
以下是使用此处http://nadeausoftware.com/articles/2008/04/java_tip_how_list_and_find_threads_and_thread_groups提供的教程实现此目的的示例示例:
获取所有主题的列表
ThreadGroup上的另一个enumerate()方法列出了该组的线程。使用真正的第二个参数,它将递归遍历该组以使用Thread对象填充给定数组。从根ThreadGroup开始,您将获得JVM中所有线程的列表。
此处的问题与列出线程组的问题相同。如果传递给enumerate()的数组太小,则可能会从返回的数组中以静默方式删除某些线程。因此,您需要猜测数组大小,调用enumerate(),检查返回的值,如果数组填满则再试一次。要获得良好的开始猜测,请查看java.lang.management包。 ManagementFactory类返回一个ThreadMXBean,它的getThreadCount()方法返回JVM中的线程总数。当然,这可能会在稍后改变,但这是一个很好的初步猜测。
Thread[] getAllThreads( ) {
final ThreadGroup root = getRootThreadGroup( );
final ThreadMXBean thbean = ManagementFactory.getThreadMXBean( );
int nAlloc = thbean.getThreadCount( );
int n = 0;
Thread[] threads;
do {
nAlloc *= 2;
threads = new Thread[ nAlloc ];
n = root.enumerate( threads, true );
} while ( n == nAlloc );
return java.util.Arrays.copyOf( threads, n );
}
答案 2 :(得分:0)
创建一个ExecutorService
,其ThreadFactory
创建守护程序线程。
例如:
ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setDaemon(true);
return thread;
}
});
谢谢Enno:)