101

私は過去数時間でそれについてかなり読んでいましたが、何十もの異なるエグゼキューターサービスを格納する巨大なアプリケーションがない限りshutdown().ExecutorService長い間使用。

(私が収集したものから)シャットダウンが行う唯一のことは、通常のスレッドが完了したら行うことです。通常の Thread が Runnable (または Callable) の run メソッドを終了すると、Garbage Collection に渡されて収集されます。Executor Service を使用すると、スレッドは単に保留にされ、ガベージ コレクションのためにチェックされることはありません。そのためには、シャットダウンが必要です。

私の質問に戻ります。shutdown をExecutorService非常に頻繁に呼び出す理由、またはいくつかのタスクを送信した直後に呼び出す理由はありますか? 誰かがそれを行っているケースを残しておき、その直後にawaitTermination()これが検証されたときに呼び出します。ExecutorServiceそれをしたら、同じことをするために、もう一度新しいものを作り直さなければなりません。ExecutorServiceスレッドを再利用するという全体のアイデアではありませんか? では、なぜExecutorServiceすぐに破壊するのでしょうか。

単純に作成する (または必要な数に応じて結合する) のは合理的な方法ではないExecutorServiceでしょうか。次に、アプリケーションの実行中にタスクを渡してから、アプリケーションの終了時またはその他の重要な段階でそれらのエグゼキューターをシャットダウンします。 ?

ExecutorServices を使用して多くの非同期コードを記述している経験豊富なコーダーからの回答が欲しいです。

2 つ目の副次的な質問ですが、Android プラットフォームに関するもう少し小規模な取引です。毎回エグゼキュータをシャットダウンするのは最善のアイデアではないと言う人もいれば、Androidでプログラムを実行する場合、さまざまなイベントを処理するときに、これらのシャットダウンをどのように処理するのですか(具体的には、それらを実行するとき)教えてください。アプリケーションのライフサイクルの。

CommonsWare のコメントのため、投稿を中立にしました。私はそれについて死ぬほど議論することに本当に興味がありません、そしてそれはそこにつながっているようです. 私がここで経験豊富な開発者に尋ねた内容について知りたいのは、経験を共有してくれるかどうかだけです。ありがとう。

4

5 に答える 5

1

ExecutorService で shutdown() を呼び出す理由

今日、そのマシンで一連のタスクを開始する前に、マシンの準備が整うまで待たなければならない状況に遭遇しました。

このマシンに REST 呼び出しを行います。503 (Server Unavailable) を受信しない場合、マシンは要求を処理する準備ができています。したがって、最初の REST 呼び出しで 200 (成功) が返されるまで待ちます。

これを実現するには複数の方法があります。ExecutorService を使用してスレッドを作成し、X 秒ごとに実行するようにスケジュールしました。だから、私は条件でこのスレッドを停止する必要があります、これをチェックしてください...

final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
    Runnable task = () -> {
        try {
            int statusCode = restHelper.firstRESTCall();

            if (statusCode == 200) {
                executor.shutdown();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    };

    int retryAfter = 60;
    executor.scheduleAtFixedRate(task, 0, retryAfter, TimeUnit.SECONDS);

2 つ目の副次的な質問です。Android プラットフォームに関するもう少し小規模な取引です。

もう少しコンテキストを提供していただければ、お答えできるかもしれません。また、私の Android 開発の経験から、スレッドが必要になることはめったにありません。パフォーマンスのためにスレッドが必要なゲームやアプリを開発していますか? そうでない場合、Android では、上記で説明したシナリオのような問題に取り組む別の方法があります。コンテキストに基づいて、TimerTask、AsyncTask、またはハンドラーまたはローダーを使用できます。これは、UIThread が長時間待機すると、何が起こるかがわかるためです :/

于 2017-09-27T22:43:41.953 に答える