2013-05-09 2 views
0
//Main.java 
public static boolean isEnd() { 
    return end; 
} 
public static void main(String[] args) { 

    execProductNumber.execute(new ProductNumber(allBuffer)); 

    end = true; 
    System.out.println("Leaving main"); 
    //execProductNumber.shutdown(); 
} 

//ProductNumber.java 
public void run() { 
    while(!Main.isEnd()) { 
     //something 
    } 
    System.out.println("Leaving thread"); 
} 

Я начинаю свою программу, получает выход:задержки темы во время прекращения

Leaving main 
Leaving thread 

и программа не завершается сразу (мне нужно ждать около 1,5 мин до успешного завершения программы). Когда я попытался остановить поток shutdown() (комментарий), он остановился сразу после. При попытке отладить я обнаружил, что он задерживает на этом (ThreadPoolExecutor.java):

final void runWorker(Worker w) { 
     Thread wt = Thread.currentThread(); 
     Runnable task = w.firstTask; 
     w.firstTask = null; 
     w.unlock(); // allow interrupts 
     boolean completedAbruptly = true; 
     try { 
      while (task != null || (task = getTask()) != null) { //here 
       w.lock(); 
       // If pool is stopping, ensure thread is interrupted; 
       // if not, ensure thread is not interrupted. This 
       // requires a recheck in second case to deal with 
       // shutdownNow race while clearing interrupt 

Ждет там некоторое время, а затем идет дальше. Зачем? Что там происходит? Это необходимо?

ответ

2

Если execProductNumber является ExecutorService, то вам необходимо позвонить shutdown() сразу же после того, как последняя работа будет отправлена ​​на обслуживание. Это будет разрешить любые уже отправленные задания.

и программа не завершается сразу

справа. Он достигает конца main(), но поток, связанный с ExecutorService, не является демоном, и он все еще работает. Вызвав execProductNumber.shutdown();, ваше приложение завершит работу сразу после завершения задачи ProductNumber.

При попытке отладить я обнаружил, что он задерживает на этом (ThreadPoolExecutor.java):

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

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