2017-07-02 38 views
0

我想創建一個基本運行在一個FIFO順序任務,並提供三個API定製的運行循環退出:addTask(Task task)run()exit()的Java:不能從自定義RunLoop實現

任務界面

public interface Task { 

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

任務RunLoop

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循環。謝謝!

回答

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