2010-06-10 94 views
3

我今天发布了关于线程模式的question,几乎所有人都建议我查看ExecutorService。当executorservice关闭时,运行/阻塞的runnables会发生什么()

当我正在查看ExecutorService时,我想我错过了一些东西。如果服务具有正在运行或被阻塞的线程,并且有人调用ExecutorService.shutdown(),会发生什么情况。正在运行或阻止的线程会发生什么?

ExecutorService在终止之前是否等待这些线程完成?

我之所以问这个问题的原因是因为很久以前我曾经涉足Java,他们不赞成使用Thread.stop(),我记得停止线程的正确方法是在必要时使用sempahores并扩展Thread :

public void run() { 
    while (!this.exit) { 
     try { 
      block(); 
      //do something 
     } catch (InterruptedException ie) { 
     } 
    } 
} 

public void stop() { 
    this.exit = true; 

    if (this.thread != null) { 
     this.thread.interrupt(); 
     this.thread = null; 
    } 
} 

ExecutorService如何处理正在运行的线程?

回答

9

ExecutorService#shutdown()

发起在以前已提交任务的执行一个有序的关闭,但没有新的任务将被接受。如果已关闭,调用没有其他影响。

所以它会等待那些线程完成。

另一种是ExecutorService#shutdownNow()

尝试停止所有正在执行的任务,暂停等待任务的处理,并返回等待执行的任务列表。

除了竭尽全力尝试停止处理主动执行的任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()来取消,所以任何不能响应中断的任务都不会终止。

你只需要在自己run()while环路上Thread#isInterrupted()听。

+1

关于shutdown()的文档中没有任何内容表示线程将被中断。 shutdownNow()的文档表明实现可能会中断正在运行的任务,但不需要它。 – dty 2010-06-10 21:49:45

+1

为了避免混淆,我在编辑答案之前发布了我的评论以正确匹配文档。 – dty 2010-06-10 22:03:40

+1

@丹尼 - 你可以删除你的评论... – 2010-06-10 22:11:08

1

我认为文档非常清晰!从内存中,它一直等到线程完成,除非你用另外的方法告诉shutdownNow()方法。

相关问题