ExecutorService,如何知道所有线程何时完成而不阻塞主线程?
我有一个multithreading实现,我创建一个ExecutorService并提交要执行的任务,我想知道所有线程被提交的时间已经完成而没有阻塞主线程和UI。 我已经尝试过ExecutorService.awaitTermination()
但它阻止了主线程和UI。 我搜索了很多,但我似乎无法找到一种优雅的方式来做到这一点。 我正在考虑创建另一个线程来计算完成的线程数量,并在它们全部完成时启动一个事件,但这不是一个好方法,我想要一个更好的解决方案!
使用SwingWorker
关闭线程池并调用awaitTermination()
。 这将阻止UI阻止并从SwingWorker实现上的Event Dispatch Thread调用done()
,您可以使用它来触发所需的任何UI更改。
如果您希望通过UI更新跟踪运行的线程,可以使用工作线程在循环中监视它,并使用参数调用publish()
,然后将参数传递给EDT上的process()
实现。
为什么不使用CountDownLatch,然后在锁存器完成时通知主线程。
isTerminated()
会做
但请注意, awaitTermination
和isTerminated
只会在您调用shutdown
后给出有意义的结果
您可以维护一个单独的线程来跟踪执行程序服务实例关闭的时间:
final ExecutorService execSvc = ...; execSvc.submit(task1); ... execSvc.submit(taskN); // important to request the exec service to shut down :) execSvc.shutdown(); new Thread(new Runnable() { public void run() { while (!execSvc.isTerminated()) { try { execSvc.awaitTermination(60, TimeUnit.SECONDS); } catch (InterruptedException e) { // ignore exception } } System.out.println("ExecSvc.run: exec service has terminated!"); // possibly submit a task using SwingUtilities.invokeLater() to update the UI } }).start();
使用CountDownLatch
CountDownLatch latch = new CountDownLatch(totalNumberOfTasks); ExecutorService taskExecutor = Executors.newFixedThreadPool(4); 而(...){ taskExecutor.execute(new MyTask()); } 尝试{ latch.await(); } catch(InterruptedException E){ //句柄 }
并在你的任务中(包含在try / finally中)
latch.countDown();
或者在ExecutorService上调用shutdown()然后调用awaitTermination()
ExecutorService taskExecutor = Executors.newFixedThreadPool(4); 而(...){ taskExecutor.execute(new MyTask()); } taskExecutor.shutdown(); 尝试{ taskExecutor.awaitTermination(Long.MAX_VALUE,TimeUnit.NANOSECONDS); } catch(InterruptedException e){ ... }
还看看这个答案
- 转换为ScheduledThreadPoolExecutor
- 如何决定是使用newCachedThreadPool还是newFixedThreadPool?
- 使用ExecutorService执行异步任务时出现问题
- 如何在java执行器类中停止所有可运行的线程?
- 如何正确使用Java Executor?
- 在ThreadPoolExecutor中使用InheritableThreadLocal – 或者 – 不重用线程的ThreadPoolExecutor
- 在ExecutorService任务中停止无限循环
- 在ExecutorService中hibernate一个线程(Java / Clojure)
- 知道所有线程何时完成并处理exception