有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Executor服务中的java不确定任务

我有以下变量:

    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.isShutdown()总是在调用的任何时候false。 告诉我如何正确跟踪任务的状态(已启动或已完成),因为我以前从未遇到过多线程编程


共 (2) 个答案

  1. # 1 楼答案

    在任务类中实现可调用接口。并将任务传递给Executor Service。提交(任务);它将返回一个未来的实例。给未来打电话。get(),它将等待调用块完成执行

  2. # 2 楼答案

    ^{}实现^{}接口,该接口具有^{}属性。当^{}变为SUCCEEDEDCANCELLEDFAILED时,您可以监听此属性并做出反应

    Task<Boolean> task = ...;
    task.stateProperty().addListener((obs, oldVal, newVal) -> {
        // Test newVal and do something as needed...
    });
    

    或者你可以听听^{}属性

    task.runningProperty().addListener((obs, oldVal, newVal) -> {
        if (!newVal) {
            // Do something...
        }
    });
    

    你也可以在^{上收听^{}

    task.setOnSucceeded(event -> {});
    task.setOnCancelled(event -> {});
    task.setOnFailed(event -> {});
    
    // or even something like
    task.addEventHandler(WorkerStateEvent.ANY, event -> {
        // Test event type and do something as needed...
    });
    

    还有受保护的“状态方法”

    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应用程序线程上通知您