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

});