Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:无法从自定义RunLoop实现中退出_Java_Task_Runloop - Fatal编程技术网

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

Java:无法从自定义RunLoop实现中退出,java,task,runloop,Java,Task,Runloop,我试图创建一个自定义运行循环,基本上以FIFO顺序运行任务,并提供三个API:addTask(Task Task),run()和exit() 任务界面 public interface Task { public void perform(); public boolean isDone(); public boolean isStarted(); } 任务运行循环 public class TaskRunLoop { private Queue<Ta

我试图创建一个自定义运行循环,基本上以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());
    }
}
公共类TaskRunLoop{
专用队列q;
私有布尔运算;
公共任务runloop(){
q=新的LinkedList();
isRunning=true;
//run();
}
公共无效添加任务(任务t){
q、 报价(t);
}
公开募捐{
while(isRunning()){
而(q.size()>0){
任务t=q.poll();
t、 执行();
}
}
}
公共无效出口(){
isRunning=false;
q、 removeAll(q);
系统出口(0);
}
公共布尔值正在运行(){
返回正在运行;
}
公共静态void main(字符串[]args){
TaskRunLoop looper=新TaskRunLoop();
对于(int i=0;i<10;i++){
looper.addTask(新任务impl(“任务”+i));
}
looper.run();
looper.exit();
System.out.println(“仍在运行?”+looper.isRunning());
}
}
任务0-9可以成功运行,但是
exit()
调用不会终止运行循环。我猜
run()
方法中的while循环无限运行,我想知道如何退出while循环。谢谢

looper.run()不是异步调用。
因此,执行确实停留在
looper.run()上并且永远不会到达
looper.exit()

为了防止它,您可以让类扩展
线程

允许调用
looper.run()
位于调用它的主线程之外的单独线程中

要启动线程,您应该调用
start()
,而不是
run()
(这是
thread
的一种特定方法):

publicstaticvoidmain(字符串[]args){
TaskRunLoop looper=新TaskRunLoop();
对于(int i=0;i<10;i++){
looper.addTask(新任务impl(“任务”+i));
}
looper.start();//而不是run()
looper.exit();
System.out.println(“仍在运行?”+looper.isRunning());
}
looper.run()不是异步调用。
因此,执行确实停留在
looper.run()上并且永远不会到达
looper.exit()

为了防止它,您可以让类扩展
线程

允许调用
looper.run()
位于调用它的主线程之外的单独线程中

要启动线程,您应该调用
start()
,而不是
run()
(这是
thread
的一种特定方法):

publicstaticvoidmain(字符串[]args){
TaskRunLoop looper=新TaskRunLoop();
对于(int i=0;i<10;i++){
looper.addTask(新任务impl(“任务”+i));
}
looper.start();//而不是run()
looper.exit();
System.out.println(“仍在运行?”+looper.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.start(); // instead of run()
    looper.exit();
    System.out.println("still running? " + looper.isRunning());
}