JavaのScheduledExecutorServiceとFutureTaskにクラリティを探しています
-
19-09-2019 - |
質問
私は先物やJavaでScheduledExecutorServiceに見て始めている、と私のコーラブルは私が指示しましたスケジュール通りに実行されていない理由を私は思ったんだけど。このサンプルコードでは、呼び出し可能は一度実行されますが、アプリが完了したことがない、また私は(私は、問題は私の期待していると確信している)起こると期待したものである、再びタスクの実行を行います。
ランナブルは正常に動作します。呼び出し可能オブジェクトは永遠にブロックするように見えるが、私はわからないんだけど、なぜ....私は何をしないのですか?
ありがとうございます。
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