我正在尝试创建一个自定义运行循环,它基本上以FIFO顺序运行任务并提供三个API:@movies = Movie.all.order(params[:sort])
,addTask(Task task)
和run()
任务界面
exit()
任务RunLoop
public interface Task {
public void perform();
public boolean isDone();
public boolean isStarted();
}
任务0 - 9可以成功运行,但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());
}
}
调用不会终止运行循环。我想虽然exit()
方法中的while循环无限运行,但我想知道如何退出while循环。谢谢!
答案 0 :(得分:2)
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());
}