2013-08-22 81 views
0
if (isDownloadLogRequired) { 
     ExecutorService pool = Executors.newFixedThreadPool(THREAD_POOL_SIZE); 
     for (HostGenericServiceTicket hostGenericServiceTicket : hostGenericServiceTickets) { 
      pool.submit(new DiagnosticLogDownloader(logNames, downloadTo, hostGenericServiceTicket)); 
     } 
     pool.shutdown(); 
     try { 
      pool.awaitTermination(downloadTimeout, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
      System.err.println(MessageFormat.format("{0}: Reason: {1}", e.getClass() 
        .getSimpleName(), e.getMessage())); 
     } 
    } 

如果downloadTimeout设置为180秒线程应该被终止并且程序应该正确结束?await在线程池终结并不会终止线程池

回答

4

否。超时时间是您想要等待多少时间。线程池将在执行完所有任务后终止。

如果调用shutdown(),线程池不会排队新的作业(但它不会阻止正在运行的作业,并且会运行已排入队列的作业)。

如果你调用shutdownNow(),它不会启动任何新的工作,并会向工作线程发送一个中断。如果您的Runnable正确检查中断并自动终止,则池将快速停止。否则,它相当于shutdown()

在Java中,没有办法强制终止一个线程(Thread.stop()已被弃用,因为它是资源泄漏和死锁倾向)。您只能要求线程终止(调用其interrupt()方法),但取决于您的代码定期检查Thread.interrupted()并正确使用InterruptedException s。

礼貌工人的一个例子是这样的:

public class PoliteWorker implements Runnable { 
    private boolean successful = false; 
    public void run() { 
     while (...) { 
      if (Thread.interrupted()) { 
       myLogger.log(Level.INFO, "Thread was interrupted. Aborting..."); 
       return; 
      } 
      ... 
      try { 
       String line = myInput.readLine(); 
      } catch (InterruptedIOException ex) { 
       //Must terminate 
       myLogger.log(Level.INFO, "Thread was interrupted. Aborting...", ex); 
       return; 
      } catch (IOException ex) { 
       //handle other exceptions 
      } 
     } 
     successful = true; 
    } 
} 
+0

不过,为什么是这个样子这个API的说明? - 布尔awaitTermination(长超时, TIMEUNIT单元) 抛出InterruptedException的 \t阻塞,直到所有任务已经完成了关机请求之后执行,或在超时 \t发生时,或当前线程中断,无论哪个首先发生。 – Manav

+0

是的,这正是我所说的“以先发生者为准”。它实际上并没有做任何事情来终止线程。 –

+0

那么程序应该在超时之后向前移动,并且结束正确的时间?......它应该只阻止超时量秒,然后应该向前移动......并且当程序死亡时,所有线程都应该死掉。 。我的意思是,在我的情况下,超时发生在第一位......所以代码在这次调用中没有更多的阻止,并向前移动? – Manav