質問

私は先物や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が使用されていることで、そのクラスのドキュメントが言うように、

runFutureTaskメソッドが一度呼び出された後、

は、後続の呼び出しは、タスクのCallableインスタンスに委譲することなく、すぐに戻ります。

のみRunnableは、定期的なタスクとして使用することができ、これが戻って結果を渡すことはできません。代わりに、Runnableタスクにそれが戻って他のスレッドでリスナーにタスクの各実行の結果を報告し、そのrunメソッドの終了時に呼び出すことができるコールバックを与える。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top