如何关闭我的java应用程序中运行的所有线程?

时间:2012-10-31 09:21:44

标签: java multithreading threadpool runnable

我想关闭我之前开始的所有主题。

Thread.currentThread()给了我当前的帖子,但其他人呢?我怎么能得到它们?

我认为 Thread.activeCount()会返回线程的线程组中活动线程的数量,但我不使用 ThreadGroup , 我刚刚使用 Thread thread = new Thread(new MyRunnable())启动了线程。

那我怎么能做到这一点? 提前谢谢......

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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或类似的东西。

答案 2 :(得分:1)

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