Java 服务中的不确定任务
我有以下变量:Java 服务中的不确定任务,java,multithreading,javafx,Java,Multithreading,Javafx,我有以下变量: private ExecutorService executor; private Task<Boolean> worker; 我有一个任务应该在另一个线程中执行,并且应该监视其状态: public Worker<Boolean> updateTemplateBuffer() { worker = new Task<Boolean>() { @Override protected
private ExecutorService executor;
private Task<Boolean> worker;
我有一个任务应该在另一个线程中执行,并且应该监视其状态:
public Worker<Boolean> updateTemplateBuffer() {
worker = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
//task code
};
executor.execute(worker);
return worker;
}
任务已正确执行,但我无法跟踪任务是否已结束
方法executor.isTerminated和executor.isshutton在调用的任何时候都始终为false。
告诉我如何跟踪任务正确启动或完成的状态,因为我以前从未遇到过多线程编程。最好在任务中设置volatile标志completed,并在执行所有逻辑后将其设置为true
class Task implements Callable<Boolean>{
private volatile boolean completed = false;
@Override
public Boolean call() throws Exception {
//task code
completed = true;
}
public boolean isCompleted(){
return this.completed;
}
}
executor.isTerminated和executor.isShutdown方法始终返回false,因为您没有关闭executor,并且无法用于检查单个任务的状态。这些方法将告诉您执行器的状态。最好在任务中完成volatile标志,并在执行所有逻辑后将其设置为true
class Task implements Callable<Boolean>{
private volatile boolean completed = false;
@Override
public Boolean call() throws Exception {
//task code
completed = true;
}
public boolean isCompleted(){
return this.completed;
}
}
executor.isTerminated和executor.isShutdown方法始终返回false,因为您没有关闭executor,并且无法用于检查单个任务的状态。这些方法将告诉您执行器的状态。在任务类中实现可调用接口。并将任务传递给executorService.SubmitTask;它将返回一个未来的实例。调用future.get,它将等待调用块完成执行在任务类中实现可调用接口。并将任务传递给executorService.SubmitTask;它将返回一个未来的实例。Call future.get将等待调用块完成执行实现具有属性的接口。您可以侦听此属性,并在更改成功、取消或失败时作出反应 您还可以在任务中收听消息 还有受保护状态方法
Task<Boolean> task = new Task<>() {
@Override
protected Boolean call() throws Exception {
return false;
}
@Override protected void succeeded() {}
@Override protected void cancelled() {}
@Override protected void failed() {}
});
所有这些选项都将在JavaFX应用程序线程上通知您。实现具有属性的接口。您可以侦听此属性,并在更改成功、取消或失败时作出反应
您还可以在任务中收听消息
还有受保护状态方法
Task<Boolean> task = new Task<>() {
@Override
protected Boolean call() throws Exception {
return false;
}
@Override protected void succeeded() {}
@Override protected void cancelled() {}
@Override protected void failed() {}
});
所有这些选项都将在JavaFX应用程序线程上通知您。executor.isTerminated/isShutdown是为执行者而不是为您的任务而设置的->。除非您调用executor.shutdown,否则它们将返回false我还建议查看此堆栈流答案->查看。executor.isTerminated/isShutdown是针对执行者的,而不是针对您的任务->。除非您已呼叫executor.shutdown,否则他们将返回False我还建议查看此stackflow答案->查看。感谢您的回答,但是如果不引入其他标志,是否真的不可能找到任务的状态?谢谢您的回答,但是,如果不引入其他标志,是否真的不可能了解任务的状态?非常感谢您提供的详细响应非常感谢您提供的详细响应
Task<Boolean> task = new Task<>() {
@Override
protected Boolean call() throws Exception {
return false;
}
@Override protected void succeeded() {}
@Override protected void cancelled() {}
@Override protected void failed() {}
});