Java:无法从自定义RunLoop实现中退出
我试图创建一个自定义运行循环,基本上以FIFO顺序运行任务,并提供三个API: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
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());
}