3

以下のコードを参考に。

for (Future<Long> future : list) {
            try {
                sum += future.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }

今、私が future.get を呼び出すと、これは呼び出しをブロックしますか? したがって、Androidアプリケーションのメインスレッドでこれを実行すると、ANR例外が発生しますか? Interrupted 例外もスローされていることに気付きましたが、これは get 関数のスレッドで呼び出されたスリープであることを意味しますか?

4

3 に答える 3

6
  1. はい、ドキュメントにFuture.get()は次のように書かれています:

    必要に応じて計算が完了するまで待機し、その結果を取得します。

    そのため、計算の結果が利用可能になるか、計算が中断される (キャンセルされるか、例外が発生する) までブロックされます。

  2. 計算が完了するまでに時間がかかる場合、ANR が発生する可能性があります。

  3. 繰り返しますが、のドキュメントからFuture.get():

    @throws InterruptedException 待機中に現在のスレッドが中断された場合

    さて、あなたFuture.get()はメインスレッドから呼び出しているので、メインスレッドを再び応答させようとして中断するのは Android システムであると思われます。ただし、アプリケーションの別のスレッドが原因である可能性もあります。アプリケーションが何を行うか、どのスレッドを作成するか、いつ、ExecutorService を使用するか (また、使用する場合はどの実装を使用するか) を指定していないため、判断するのは困難です。等々。

  4. いいえ、 (あなたが使用してFutureTask.get()いる実装であると私は信じています)は呼び出しません。代わりに、スレッドを待機モードにすることは、スレッド パーキングを介して行われます。これにより、シグナルが与えられるまで実行がスケジュールされなくなります。これをメイン スレッドで実行すると、ANR エラーが発生する可能性があります。メカニズムの詳細については、ドキュメントとこの質問を読むことを検討してくださいFutureThread.sleep()parking

于 2012-12-18T21:35:11.730 に答える