Java任务什么都不做?

时间:2018-03-13 18:21:16

标签: java multithreading javafx task executorservice

我有一个程序,其中我使用由 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
   - 爪哇    - Windows 10 Pro

1 个答案:

答案 0 :(得分:1)

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

您是否考虑过直接从Callable创建匿名类?或者您是否故意使用Task类,因为您正在使用JavaFX?

如果您正在使用JavaFX并且故意使用Task,那么Task API会建议以下内容:

  

虽然ExecutorService定义了几个采用a的方法   Runnable,你通常应该限制自己使用execute   从Executor继承的方法。

Task API

call方法通常适用于使用Service

的方法

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