java - 寻求对 Java ScheduledExecutorService 和 FutureTask 的澄清

标签 java multithreading futuretask

我刚刚开始研究 Java 中的 Futures 和 ScheduledExecutorService,我想知道为什么我的 Callable 没有按照我指定的时间表运行。在此示例代码中,可调用对象运行一次,但应用程序永远不会完成,任务也不会再次运行,这是我预期会发生的情况(我确定问题出在我的预期范围内)。

Runnables 工作正常; Callables 似乎永远阻塞,但我不确定为什么......我错过了什么?

谢谢!

   public class ExecutorExample {

    /**
     * @param args
     * @throws ExecutionException 
     * @throws InterruptedException 
     */
    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ScheduledExecutorService scheduler =  Executors.newScheduledThreadPool(5);

        FutureTask<ArrayList<String>> ft1 = new FutureTask<ArrayList<String>>(new Callable<ArrayList<String>>(){
            @Override
            public ArrayList<String> call() {
                ArrayList<String> stuff = new ArrayList<String>();
                for(int i = 0;i<10;i++){
                    String thing ="Adding " + i + " to result"; 
                    stuff.add(thing);
                    System.out.println(thing);

                }
                return stuff;
            }});

        scheduler.scheduleAtFixedRate(ft1, 0, 1, TimeUnit.SECONDS);

        System.out.println(ft1.get());
        System.out.println(ft1.isDone());

    }
}

最佳答案

问题是 FutureTask被使用,正如它的类文档所说,“一旦计算完成,计算就不能重新启动或取消。”

run之后FutureTask的方法|被调用一次,后续调用立即返回,不委托(delegate)给任务的Callable实例。

只有一个Runnable可以用作重复任务,这不允许传回结果。相反,给出 Runnable任务它可以在其 run 结束时调用的回调方法,将任务的每次执行结果报告回其他线程中的监听器。

关于java - 寻求对 Java ScheduledExecutorService 和 FutureTask 的澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1179620/

相关文章:

java - 提交给执行者的 FutureTask 不运行

java - 在java中运行带有超时的异步代码

java - 在远程主机上没有root权限的情况下使用jenkins重启Jboss eap

java - response.sendError(403),但返回是404

java - Eclipse Mars DDMS 仅显示 Level 中的第一个字母,没有消息

c# - 是否可以同时在多个线程中运行 500 个不同的操作?

c++ - i7 处理器与 windows8 操作系统的多线程问题

java - 干净地停止线程

java - 如何在1.8中使用可调用的futuretask完全杀死正在执行的任务

java - 为 RESTLET Web 服务编写测试用例的最佳方法是什么?