0

我想关闭我之前启动的所有线程。

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

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

那么我该如何实现呢?提前致谢...

4

3 回答 3

4

您可以使用 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();
于 2012-10-31T09:25:24.070 回答
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 或类似的东西。

于 2012-10-31T09:29:11.710 回答
1

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

于 2012-10-31T09:30:23.263 回答