0

我正在尝试创建一个自定义运行循环,它基本上以 FIFO 顺序运行任务并提供三个 API addTask(Task task)run()exit()

任务界面

public interface Task {

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

任务运行循环

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循环无限运行,我想知道如何退出那个while循环。谢谢!

4

1 回答 1

2

looper.run();不是异步调用。
所以执行确实停留在 looper.run();并且永远不会到达 looper.exit();

为了防止它,你可以让你的类 extends 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());
}
于 2017-07-02T19:37:32.770 回答