【问题标题】:Java: cannot exit from a custom RunLoop implementationJava:无法退出自定义 RunLoop 实现
【发布时间】:2017-07-02 19:34:30
【问题描述】:

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

【问题讨论】:

    标签: java task runloop


    【解决方案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());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2011-01-25
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 2023-03-07
      • 2011-10-31
      相关资源
      最近更新 更多