2015-04-16 2 views
2

Я сделал простой тест, и код, как показано ниже:Почему поток не может быть прерван в ExecutorService?

public class InterruptTest 
    { 
     public static class MyTask implements Runnable { 
      @Override 
      public void run() { 
       System.out.println("before sleep " + Thread.currentThread().isInterrupted()); 
       System.out.println(Thread.currentThread()); 
       Thread.currentThread().interrupt(); 
       System.out.println("after sleep " + Thread.currentThread().isInterrupted()); 
      } 
     } 

     public static void main(String[] str) 
     { 
      ExecutorService service = Executors.newFixedThreadPool(1); 
      // MyTask task1 = new MyTask(); 
      Future<?> future1 = service.submit(new InterruptTest.MyTask()); 
      Future<?> future2 = service.submit(new InterruptTest.MyTask()); 

      try 
      { 
       Thread.sleep(10); 
      } 
      catch (InterruptedException e) 
      { 
       System.out.println("interrupted;"); 
      } 
     } 
} 

И выход:

before sleep false 
Thread[pool-1-thread-1,5,main] 
after sleep true 
**before sleep false** // line 4 
Thread[pool-1-thread-1,5,main] 
after sleep true 

почему линия 4 до сих пор выход ложным? не правда ? Потому что в текущем пуле есть только один поток, и он должен был быть прерван в первой задаче, почему он все еще доступен (не прерывается) при выполнении второй задачи?

Заранее благодарен!

Другой вопрос, я могу изменить функцию запуска, как показано ниже:

public static class MyTask implements Runnable { 
    @Override 
    public void run() { 
     System.out.println("before sleep " + Thread.currentThread().isInterrupted()); 
     System.out.println(Thread.currentThread()); 

     try 
     { 
      Thread.sleep(10); 
     } 
     catch (InterruptedException e) 
     { 
      System.out.println("interrupted;"); 
      System.out.println("after sleep " + Thread.currentThread().isInterrupted()); 
      System.out.println(Thread.currentThread()); 
     } 
    } 
} 

И выход одной задачи является:

before sleep false 
Thread[pool-1-thread-1,5,main] 
interrupted; 
after sleep false 

Задача должна быть просыпался от сна Thread.interrupt. Но когда я использую Thread.currentThread(). IsInterrupted(), чтобы проверить его, он все равно возвращает false.

Будет спать() есть прерывающее состояние ??

+2

Нет, 'sleep()' не проглатывает прерванное состояние. Бросание 'InterruptedException' (несколько извращенно) не приводит к тому, что прерванный флаг устанавливается на прерванный поток: поэтому вам нужно вручную переинтерпретировать текущий поток, если вы поймаете' InterruptedException', и вы не хотите или не можете распространять это исключение, но вы хотите сохранить доказательства того, что поток был прерван для вызывающих. –

+0

@AndyTurner Спасибо! – oyjh

ответ

3

Глядя на исходный код ThreadPoolExecutor, есть частный метод, называемый clearInterruptsForTaskRun документированы как:

гарантирует, что если бассейн не останавливая текущий поток не имеет его прерывания установить

+0

Спасибо за ваш ответ! Я нашел код, связанный с runWorker: – oyjh

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

  • Нет связанных вопросов^_^