Java:无法退出自定义RunLoop实现

时间:2017-07-02 19:34:31

标签: java task runloop

我正在尝试创建一个自定义运行循环,它基本上以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循环。谢谢!

1 个答案:

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