2015-03-25 1 views
-2

У меня есть следующий образец, созданный для имитации ситуации, с которой я сталкиваюсь, связанной с завершением процесса ExecutionService. Кажется, что он завершает только один поток из 3-х ... и я получаю сообщения об ошибках на сервере tomcat.Завершение работы Java не завершает работу всех потоков?

public class Test { 
static final ExecutorService threadExecutor = Executors.newCachedThreadPool(); 

static Runnable getTask(final String name) { 

    return new Thread() { 

     @Override 
     public void run() { 
      this.setName("Thread-" + name); 
      while (true) { 
       try { 
        System.out.println(name + " running...[" + this.getName() + "]"); 
        Thread.sleep(10000); 
       } catch (InterruptedException e) { 
        System.out.println("InterruptedException..." + this.getName()); 
throw new Exception(e); 
       } 
      } 

     } 
    }; 
} 

public static void main(String... strings) { 
    threadExecutor.submit(getTask("Task-1")); 
    threadExecutor.submit(getTask("Task-2")); 
    threadExecutor.submit(getTask("Task-3")); 
    //-- 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     @Override 
     public void run() { 
      ThreadPoolExecutor tpe = (ThreadPoolExecutor) threadExecutor; 
      System.out.println("Active Threads=====>" + tpe.getActiveCount()); 
      tpe.shutdown(); 
      try { 
       if (!threadExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS)) { 
        System.out.println("Executor did not terminate in the specified time."); 
        List<Runnable> droppedTasks = tpe.shutdownNow(); 
        System.out.println("Shutdown thread pool forecibly. " + droppedTasks.size() + " tasks will not be executed."); 
       } 
       System.out.println("Active Threads=====>" + tpe.getActiveCount()); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

} 

}

ответ

1

shutdown() инициирует процесс выключения в пуле потоков, но позволяет текущие эксплуатационные задачи, чтобы закончить. В вашем примере задача не заканчивается из-за while(true).

shutdownNow() инициирует выключение, а также прерывает текущие потоки. Но опять же ваша задача - обработать это прерванное исключение и запустить цикл while(true).

Я думаю, вы можете просто поделиться общим логическим значением между вашими задачами и кодом вызывающего абонента, из которого вы вызываете threadPoolExecuror.shutdown(). Используйте это логическое значение в задаче вместо while(true).