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());
}