关于Java ScheduledExecutorService的和FutureTask求清晰
-
19-09-2019 - |
题
我刚开始寻找到期货和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
被使用,并且作为它的类文件说,“一旦计算完成,计算无法重新启动或取消。”
run
的FutureTask
方法已被调用一次后,后续调用立即返回,而不委托给该任务的Callable
实例。
只有Runnable
可以用作重复任务,并且这不允许传回的结果。相反,给所述Runnable
任务的回调,它可以在其run
方法结束时调用,对任务的每个执行结果报告给其他线程的监听器。
不隶属于 StackOverflow