6

私はJavaでFuturesとScheduledExecutorServiceを調べ始めたところですが、なぜCallableが指定したスケジュールで実行されないのか疑問に思っています。このサンプルコードでは、呼び出し可能オブジェクトは1回実行されますが、アプリが完了したり、タスクが再度実行されたりすることはありません。これは、私が予想していたことです(問題は私の予想にあると確信しています)。

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());

    }
}
4

1 に答える 1

9

問題はそれFutureTaskが使用されていることであり、そのクラスのドキュメントに記載されているように、「計算が完了すると、計算を再開またはキャンセルすることはできません」。

runメソッドがFutureTask1回呼び出された後、後続の呼び出しは、タスクのCallableインスタンスに委任することなく、すぐに戻ります。

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

于 2009-07-24T19:31:15.767 に答える