В приведенном ниже тестовом классе выводится только «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();
}
в конец метода тестирования, то он работает так, как ожидалось.
_В ниже тестового класса выводится только «до». Вы уверены? Меня устраивает. – BackSlash
У меня есть 1 с задержка между каждым 'println()', но задержка между 'before' и' after'. –
@SotiriosDelimanolis «задержка между до и после» - это не то же самое, что и код, который я разместил? –