我想结束我以前发表的所有主题。如何关闭在我的Java应用程序中运行的所有线程?
Thread.currentThread()给我当前的线程,但其他的呢?我怎样才能得到它们?
我觉得Thread.activeCount()返回活动线程的线程的线程组的数量,但使用我不使用线程组, 我刚开始线程线程的线程=新主题(新MyRunnable() )。
所以,我怎么能做到这一点? 在此先感谢...
我想结束我以前发表的所有主题。如何关闭在我的Java应用程序中运行的所有线程?
Thread.currentThread()给我当前的线程,但其他的呢?我怎样才能得到它们?
我觉得Thread.activeCount()返回活动线程的线程的线程组的数量,但使用我不使用线程组, 我刚开始线程线程的线程=新主题(新MyRunnable() )。
所以,我怎么能做到这一点? 在此先感谢...
您可以使用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();
您可以简单地将引用保留在某个地方的所有线程(如列表),然后再使用引用。
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或类似的东西。
如果您希望继续直接使用Thread对象而不使用java.util.concurrent的即时可用线程服务,则应该保留对所有已启动线程的引用(例如,将它们放入List中)以及何时希望关闭它们,或者中断它们停止,遍历列表。
我想单独运行这些线程随机时间,然后要中断或阻止他们。 我认为service.shutdown()将所有线程执行完成后阻止他们,是不是正确的? –
ExecutorService的具有执行任务的线程池。提交的任务将在停止线程之前执行。从文档:“启动一个有序的关闭,在其中执行先前提交的任务,但不会接受新任务” – breezee
我已经添加了一个如何取消和中断个别任务的示例。 –