Java: не может выйти из пользовательской реализации RunLoop

Я пытаюсь создать пользовательский цикл выполнения, который в основном запускает задачи в порядке FIFO и предоставляет три API: addTask(Task task), run() а также exit()

Интерфейс задач

public interface Task {

    public void perform();
    public boolean isDone();
    public boolean isStarted();
}

Task RunLoop

public class TaskRunLoop {

    private Queue<Task> q;

    private boolean isRunning;

    public TaskRunLoop() {
        q = new LinkedList<>();
        isRunning = true;
//        run();
    }

    public void addTask(Task t) {
        q.offer(t);
    }

    public void run() {
        while(isRunning()) {
            while (q.size() > 0) {
                Task t = q.poll();
                t.perform();
            }
        }
    }

    public void exit() {
        isRunning = false;
        q.removeAll(q);
        System.exit(0);
    }

    public boolean isRunning() {
        return isRunning;
    }

    public static void main(String[] args) {

        TaskRunLoop looper = new TaskRunLoop();
        for (int i = 0; i < 10; i++) {
            looper.addTask(new TaskImpl("task " + i));
        }

        looper.run();
        looper.exit();
        System.out.println("still running? " + looper.isRunning());
    }
}

Задачи 0 - 9 могут быть успешно выполнены, но exit() вызов не убивает цикл выполнения. Я думаю, что пока цикл в run() Метод работает бесконечно, мне было интересно, как выйти из цикла while. Спасибо!

1 ответ

looper.run(); это не асинхронный вызов.
Таким образом, исполнение остается действительно застрял на looper.run(); и никогда не достигает looper.exit();,

Чтобы предотвратить это, вы можете сделать свой класс расширяемым Thread,
Который позволяет вызывать looper.run(); в отдельном потоке от основного потока, который его вызывает.

Чтобы начать поток, вы должны вызвать start() и не run() (это особый метод Thread):

public static void main(String[] args) {

    TaskRunLoop looper = new TaskRunLoop();
    for (int i = 0; i < 10; i++) {
        looper.addTask(new TaskImpl("task " + i));
    }

    looper.start(); // instead of run()
    looper.exit();
    System.out.println("still running? " + looper.isRunning());
}
Другие вопросы по тегам