Имеется класс
LiftOff, реализующий интерфейс
Runnable. Создаем подкласс
SleepingTask, в котором методом
TimeUnit.SECONDS.sleep(9);
переводим поток в состояние ожидание на 9 секунд и запускаем всё это чудо с помощью
ExecutorService в тестовом методе. Вопрос, почему вывод всего-лишь такой:
step: 0
step: 1
step: 2
step: 3
step: 4
status: Thread id#0 (9),
status: Thread id#1 (9),
status: Thread id#3 (9),
status: Thread id#2 (9),
status: Thread id#4 (9),
класс LiftOff
public class LiftOff implements Runnable {
protected int countDown = 10; // default
private static int taskCount = 0;
private final int id = taskCount++;
public LiftOff() {
}
public LiftOff(int countDown) {
this.countDown = countDown;
}
public String status() {
StringBuilder msg = new StringBuilder("Thread id#").append(id)
.append(" (").append(countDown > 0 ? countDown : "LiftOff!")
.append("), ");
return msg.toString();
}
@Override
public void run() {
while (countDown-- > 0) {
System.out.println(status());
Thread.yield();
}
}
}
класс SleepingTask
import java.util.concurrent.TimeUnit;
public class SleepingTask extends LiftOff {
@Override
public void run() {
try {
while (countDown-- > 0) {
System.out.println("status: " + status());
TimeUnit.SECONDS.sleep(9);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
тестовый метод запуска
@Test
public void runWithSleep() {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 5; i++) {
System.out.println("step: " + i);
exec.execute(new SleepingTask());
}
exec.shutdown();
}