2013-12-18 89 views
1

我正在编写代码,我需要确保在提交结果之前线程池中没有线程正在运行(以避免丢失我应该提交的数据)。对于这一点,我使用:我如何知道ThreadPoolExecutor中的线程已完成?

while (_executor.getActiveCount() > 0) 
{ 
    try 
    { 
    Thread.sleep(10); // milliseconds 
    } 
    catch (InterruptedException e) 
    { 
    // OK do nothing 
    } 
} 

但同事回顾指出,getActiveCount商务部指出:

  • 返回正在积极
  • 执行的线程的大致数量任务。

那么,有没有危险,我会得到了while循环,同时还有在游泳池活动线程?如果是这样,那么等待我的所有工作线程完成的正确方法是什么?

编辑:给更多的上下文:这是一个在线系统,其中包含执行程序服务的任务保持无限期运行。工作通过消息传递系统进入,放在执行程序中的一个线程中,不需要任何同步,工作就会进入消息传递系统的另一个队列。我不想杀死执行者等待完成任务。

+0

你能等待的任务的执行,而不是等待执行是没有工作? http://stackoverflow.com/questions/12896755/executorservice-with-invokeall-and-future-in-java – zapl

回答

0

要通知线程它应该清理并终止,请使用中断方法。 t.interrupt();

这是很好的打印或从catch块有你的错误日志。

1

_executor.awaitTermination();应该做的工作。现在,它不会实际等待线程关闭,而是等待所有可用的任务终止。

你也可以提供keepAliveTime到一个线程池构造立即终止空闲线程:

ExecutorService executor = new ThreadPoolExecutor(0, 10, 0L /* keepAlive */, 
     TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); 
0

当任务提交给执行者,他们返回期货,这表明他们完成。这是使用的首选机制。

您可以使用JDK ExecutorService shutdown/awaitTermination。

+0

Executor's ​​return void。为了获得'未来',你需要使用'CompletionService'。 – bstempi

+0

@bstempi'ExecutorService'返回'Future's和void。 'ExecutorService.submit'返回Runnables和Callables的期货。 –

+0

JDK接口'ExecutorService' - 和所有实现类 - 绝对返回Futures。 – user2684301

0

用例:需要清理池线程完成时的线程局部线程,并且此清理可能需要很长时间(例如连接关闭)。只有在这之后主线程才能继续。

工作者线程可以在某个集合中注册自己。对于覆盖start()run(),并通过自定义线程工厂ThreadPoolExecutor

class MyThreadFactory implements ThreadFactory { 

    @Override 
    public Thread newThread(final Runnable r) { 
     return new MyThread(r); 
    } 
... 

class Some { 
    void waitAllThreads() { 
     Thread worker; 
     while ((worker = workerThreads.poll()) != null) { 
      worker.join(); 
     } 
    } 
    ... 

class MyThread extends Thread { 

    @Override 
    public synchronized void start() { 
     if (getState() == State.NEW) { 
      some.workerThreads.offer(this); 
     } 
     super.start(); 
    } 

    @Override 
    public void run() { 
     try { 
      super.run(); 
     } finally { 
      some.workerThreads.remove(this); 
     } 
    } 

    ... 
相关问题