我刚开始寻找到期货和Java中的ScheduledExecutorService的,我想知道为什么我的可赎回是不是在我指定的时间表运行。在此示例代码,可调用运行一次,但应用程序无法完成,也不再做任务运行,这是我希望发生(我敢肯定,问题是我的期望)。

的Runnable很好地工作;可调用似乎永远阻止,但我不知道为什么....我缺少什么?

谢谢!

   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被使用,并且作为它的类文件说,“一旦计算完成,计算无法重新启动或取消。”

runFutureTask方法已被调用一次后,后续调用立即返回,而不委托给该任务的Callable实例。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top