2012-10-31 51 views
0

我想结束我以前发表的所有主题。如何关闭在我的Java应用程序中运行的所有线程?

Thread.currentThread()给我当前的线程,但其他的呢?我怎样才能得到它们?

我觉得Thread.activeCount()返回活动线程的线程的线程组的数量,但使用我不使用线程组, 我刚开始线程线程的线程=新主题(新MyRunnable() )

所以,我怎么能做到这一点? 在此先感谢...

回答

3

您可以使用ExecutorService的,而不是它结合了任务队列线程池。

ExecutorService service = Executors.newCachedThreadPool(); 
// or 
ExecutorService service = Executors.newFixedThreadPool(THREADS); 

// submit as many tasks as you want. 
// tasks must honour interrupts to be stopped externally. 
Future future = service.submit(new MyRunnable()); 

// to cancel an individual task 
future.cancel(true); 

// when finished shutdown 
service.shutdown(); 
+0

我想单独运行这些线程随机时间,然后要中断或阻止他们。 我认为service.shutdown()将所有线程执行完成后阻止他们,是不是正确的? –

+0

ExecutorService的具有执行任务的线程池。提交的任务将在停止线程之前执行。从文档:“启动一个有序的关闭,在其中执行先前提交的任务,但不会接受新任务” – breezee

+0

我已经添加了一个如何取消和中断个别任务的示例。 –

2

您可以简单地将引用保留在某个地方的所有线程(如列表),然后再使用引用。

List<Thread> appThreads = new ArrayList<Thread>(); 

每次启动一个线程:

Thread thread = new Thread(new MyRunnable()); 
appThreads.add(thread); 

然后,当你想终止信号(不通过stop我希望:d)您可以轻松访问到您创建的线程。

您也可以使用ExecutorService和调用shutdown当你不再需要它:

ExecutorService exec = Executors.newFixedThreadPool(10); 
... 
exec.submit(new MyRunnable()); 
... 
exec.shutdown(); 

这是更好,因为你真的不应该为您创建要执行的每个任务的一个新的线程,除非它是长时间运行I/O或类似的东西。

1

如果您希望继续直接使用Thread对象而不使用java.util.concurrent的即时可用线程服务,则应该保留对所有已启动线程的引用(例如,将它们放入List中)以及何时希望关闭它们,或者中断它们停止,遍历列表。

相关问题