ホームページ  >  に質問  >  本文

JDK8 で CompletableFuture を使用する際の問題

リーリー

結果は次のとおりです:

リーリー

上記コードの最終行をコメントアウトすると期待した結果が得られません。

プログラムを明示的に 10 秒間スリープさせる必要があるのはなぜですか?

伊谢尔伦伊谢尔伦2683日前875

全員に返信(2)返信します

  • 某草草

    某草草2017-06-15 09:24:15

    のjavadocを参照してください: CompletableFuture.supplyAsync

    指定された Supplier を呼び出すことによって取得された値を使用して、

    で実行されているタスクによって非同期的に完了される新しい CompletableFuture を返します。 ForkJoinPool.commonPool()そして

    の Javadoc:

    ForkJoinPool.commonPool()このプールは静的に構築され、その実行状態はシャットダウンまたは shutdownNow の試行には影響されません。

    ただし、このプールと進行中の処理は終了する前に、プログラム
    によって自動的に終了されます。

    最後にを入れれば期待通りの結果も得られますSystem.exit. Any program that relies on asynchronous task processing to complete before program termination should invoke commonPool().awaitQuiescence

    返事
    0
  • 某草草

    某草草2017-06-15 09:24:15

    検索: デーモン スレッド
    スレッドにデーモン スレッドのみが残っている場合、JVM は終了します。それ以外の場合、ユーザー スレッドが存在する場合、JVM は終了しません。
    CompletableFuture.supplyAsync がデーモン スレッドを開始すると推測できます。実際、CompletableFuture はデフォルトで内部で ForkJoinPool を使用し、スレッド ファクトリ クラスを初期化します。 リーリー

    彼の実装を見て、毎回デーモンを作成します。なぜメインスレッドがスリープしなければならないのかについては、簡単に理解できます。

    返事
    0
  • キャンセル返事