2013-09-18 2 views
2

В приведенном ниже тестовом классе выводится только «before».Thread.sleep, вызывающий непредвиденное поведение в цикле ExecutorService

Но если я удалил Thread.sleep следующее выводимый:

before 
after 
before 
after 
before 
after 
before 
after 
before 
after 
before 
after 
before 
after 
before 
after 
before 
after 
before 
after 

Что я ожидаю.

Когда я использую Thread.sleep Я думаю, что должно быть 1000мс задержка между каждым выходом

before 
after 

Почему это не встречающийся & как код может быть изменен таким образом, что генерируемый вывод такой же, независимо вызова сна или нет?

import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import org.junit.Test; 

public class RunExecutorTest { 

    private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 

    private class RunTest implements Runnable { 
     public void run() { 

      System.out.println("before"); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      System.out.println("after"); 
     } 
    } 

    @Test 
    public void testRun() { 

     Runnable r = new RunTest(); 

     for(int counter = 0; counter < 10; ++counter) { 
      executor.execute(r); 
     } 
    } 

} 

Обновление от чтения комментария ниже «@ user470184 Это не работает в тестовом JUnit случаев, потому что Junit убивает все темы, когда основной поток завершается. - Sotirios Delimanolis», если добавить

try { 
    Thread.sleep(10000); 
} catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

в конец метода тестирования, то он работает так, как ожидалось.

+0

_В ниже тестового класса выводится только «до». Вы уверены? Меня устраивает. – BackSlash

+0

У меня есть 1 с задержка между каждым 'println()', но задержка между 'before' и' after'. –

+0

@SotiriosDelimanolis «задержка между до и после» - это не то же самое, что и код, который я разместил? –

ответ

4

Когда я использую Thread.sleep Я думаю, что должно быть 1000мс задержка между каждым выходом

до после

Почему это не встречающийся & как может быть изменен код так , что сгенерированный вывод такой же, независимо от вызова сна или нет?

Задержка явно между before и after, а не между каждой итерации этих

System.out.println("before"); 

try { 
    Thread.sleep(1000); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

System.out.println("after"); 

уступая

before 
...1000 millis 
after 
before 
...1000 millis 
after 

Возможно, я неправильно понял ваш вопрос.

private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 

Все это будет выводиться последовательно.


А почему он терпит неудачу с JUnit, JUnit убивает все темы, когда его основной поток завершает выполнение. Вы не можете реально контролировать это (не выполняя свой собственный механизм ожидания).

+1

, он работает как ожидалось, когда я использую автономный класс, как в http://ideone.com/3jeCar. Но он не работает при использовании в классе junit test –

+4

@ user470184 Он не работает в тестовых случаях junit, потому что Junit убивает все потоки, когда основной поток завершается. –

+0

спасибо, это работает. –