@n199a
Java

Почему поток не отрабатывает задуманного в Java?

Имеется класс 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();
    }

  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
Vamp
@Vamp
Такой вывод получается из-за того, что тест считается завершенным сразу после выхода из метода runWithSleep, после которого программа завершается принудительно, несмотря на наличие всё ещё выполняющихся не daemon потоков.

Чтобы увидеть полный вывод запустите код не в контексте junit или добавьте ожидание в код теста:

exec.shutdown();
exec.awaitTermination(100, TimeUnit.SECONDS);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xez
@xez Куратор тега Java
Senior Junior Roo
Надо, наверное, подождать 9 секунд этих... глядишь, еще какой-то вывод будет
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы