2013-08-22 2 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 секунд, потоки должны быть убиты, а программа должна заканчиваться правильно?awaitTermination в threadpool не завершает пул потоков

ответ

4

No. Тайм-аут - сколько вы хотите подождать. Путь потока завершится, когда будет выполнена вся его задача.

Если вы вызываете shutdown(), threadpool не будет запускать новые задания (но это не остановит выполняемые задания и запустит задания, которые уже установлены в очередь).

Если вы позвоните shutdownNow(), он не начнет никаких новых заданий и отправит прерывание рабочим потокам. Если ваш Runnable s правильно проверит прерывания и добровольно прекратит работу, пул остановится быстро. В противном случае это эквивалентно 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

Смежные вопросы