【问题标题】:Java task does nothing?Java任务什么都不做?
【发布时间】:2018-03-13 18:21:16
【问题描述】:

我有一个程序,我在其中使用由 ExecutorService 控制的多个任务。我实际上使用了 Runnable,现在将其更改为任务,但是我似乎做错了什么,因为我的任务中应该发生的一切没有发生。我应该提一下,程序没有完成,它会无限运行。谁能告诉我我错过了什么?

public class Test{
    ExecutorService exec;

    public Test (){
        exec = Executors.newCachedThreadPool();
        run();
    }

    public static void main(String[] args) {
        Test test = new Test();
    }

    private void run() {
        System.out.println("This works normal");
        Task<Void> task = new Task<Void>() {
            @Override
            protected Void call(){
                System.out.println("Here nothing happens already");
                for (int i = 0; i < 10; i++)
                    exec.submit(() -> { System.out.println("Offcourse no sub-task works either"); });
                return null;
            }
        };
        exec.submit(task);
    }
}

这些是我的导入:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javafx.concurrent.Task;

我使用:
- Netbeans IDE 8.2
- Java
- Windows 10 专业版

【问题讨论】:

  • 现在请解释你为什么使用Task

标签: java multithreading javafx task executorservice


【解决方案1】:

作为一个不寻常的功能,Task(它是 javafx 包的一部分)同时实现了CallableRunnable。当您将您的任务提交给ExecutorService 时,它会调用Task.run 方法,该方法在Task 中有一个空的存根实现。如果您在匿名类中覆盖 run,那么您将看到您的代码运行。

您是否考虑过直接从Callable 创建一个匿名类?还是因为您正在使用 JavaFX 而故意使用 Task 类?

如果您正在使用 JavaFX 并有意使用 Task,那么 Task API 建议如下:

虽然 ExecutorService 定义了几个方法 可运行,您通常应该限制自己使用执行 继承自 Executor 的方法。

Task API

call 方法通常适用于使用Service

要关闭ExecutorService,您应该调用exec.shutdown()

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多