問題タブ [executorservice]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
10337 参照

java - ThreadPoolExecutorのBlockingQueueにタスクを追加することをお勧めしますか?

JavaDoc for ThreadPoolExecutorBlockingQueueは、エグゼキュータのバッキングにタスクを直接追加できるかどうかについては不明です。ドキュメントによると、呼び出しexecutor.getQueue()は「主にデバッグと監視を目的としています」。

私はThreadPoolExecutor自分でを構築していBlockingQueueます。キューへの参照を保持しているので、タスクを直接キューに追加できます。同じキューが返されるgetQueue()ので、の警告はgetQueue()、私の手段で取得したバッキングキューへの参照に適用されると思います。

コードの一般的なパターンは次のとおりです。

queue.offer()vsexecutor.execute()

私が理解しているように、一般的な使用法は、を介してタスクを追加することですexecutor.execute()。上記の私の例のアプローチには、キューをブロックするという利点がありexecute()ますが、キューがいっぱいになり、タスクが拒否されるとすぐに失敗します。また、ジョブの送信がブロッキングキューと相互作用することも気に入っています。これは私にとってより「純粋な」生産者/消費者のように感じます。

キューにタスクを直接追加することの意味:呼び出す必要がありますprestartAllCoreThreads()。そうしないと、ワーカースレッドが実行されません。エグゼキュータと他の相互作用がないと仮定すると、キューを監視するものはありません(ThreadPoolExecutorソースの調査によりこれが確認されます)。これは、直接エンキューのThreadPoolExecutor場合、0を超えるコアスレッド用に追加で構成する必要があり、コアスレッドがタイムアウトできるように構成してはならないことも意味します。

tl; dr

次のようにThreadPoolExecutor構成されている場合:

  • コアスレッド>0
  • コアスレッドはタイムアウトできません
  • コアスレッドは事前に開始されています
  • BlockingQueue遺言執行者の支援への参照を保持する

呼び出す代わりに、タスクをキューに直接追加することはできますexecutor.execute()か?

関連している

この質問(プロデューサー/コンシューマーワークキュー)も同様ですが、キューに直接追加することについては特に説明していません。

0 投票する
4 に答える
29258 参照

java - Java でスレッド プールのスレッドに名前を付ける方法

フレームワークを使用する Java アプリケーションがありExecutor、次のようなコードがあります。 protected ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(5)

私の理解では、JVM は内部的に 5 つのスレッドのプールを作成します。プロファイラーで実行を確認すると、次のような結果が得られthread-pool2,thread-pool3ます。

Some of these thread pools are created by the server and some are created by me私が作成したものとサーバーが作成したものを区別する方法が必要です

スレッドプールに名前を付けることができればうまくいくはずですが、同じことを可能にするAPIは見当たりません。

前もって感謝します。

0 投票する
1 に答える
9366 参照

java - スレッド終了時のJavaExecutorServiceコールバック

キャッシュされたスレッドプールExecutorServiceを使用して、非同期のバックグラウンドタスクを実行しています。スレッドをExecutorServiceに渡すThreadFactoryを提供しました(必要なときはいつでも)。キャッシュされたスレッドプールについての私の理解は、スレッドが60秒間アイドル状態になった後、ExecutorServiceによって終了されるということです。

スレッドが終了しようとしているときに、状態のクリーンアップを実行したいと思います。これを達成するための最良の方法は何ですか?ExecutorServiceは、スレッドのライフサイクルへのフックを容易に提供しません。

ExecutorServiceをシャットダウンしたくありません-タスクが発生したときにタスクを実行するのに便利です。

ありがとう、

シュレヤス

0 投票する
2 に答える
1543 参照

java - ScheduledExecutorService の再利用

だから、私は次のものを持っているとしましょうScheduledExecutorService

現在は、定期的なタスク (ディレクトリ ポーリングなど)execを実行するために使用されます。しかし、この 1 つのタスク (つまり) は1 回実行されますが、遅延が必要です。それで、このタスクを実行するために使用することにしましたが、これは良い設計ですか? 代わりに、 を作成してから を呼び出す必要がありましたか? 例えば、executeOnceexecnewSingleThreadExecutorshutdown

後者を実装するメリットはありますか?

0 投票する
1 に答える
265 参照

java - さまざまなスレッドによってアップロードされているファイルを追跡する

Javaでは、ファイルのディレクトリを保持し、要求に応じて他のFileManagerにアップロードするFileManagerを作成しようとしています。アップロード要求が(ソケットを介して)着信するたびに、要求されたファイルのアップロードを処理するための新しいスレッドが作成されます。

私はこれに対処するためにExecutorServiceとを使用することを考えていました。FileUploader implements Runnable

つまり、セッションがExecutorServiceであり、mySocketがFileManagerが要求をリッスンしているソケットである場合、各スレッドの作成は次のようになります。

問題は、FileManagerがデータベース内のファイルの名前を変更するコマンドを取得した場合、ファイルの名前を変更する前に、現在ファイルをアップロードしているすべてのスレッドが終了するのを待つ必要があることです。

問題は、特定のファイルをアップロードしているスレッドの数/スレッドを追跡するにはどうすればよいかということです。

0 投票する
6 に答える
33852 参照

java - Java: ExecutorService スレッドの強制停止

私のコード:

しかし、トレントのダウンロードには不明な時間値がかかり、« awaitTermination» が思い通りに動作しないことがあります。実行されたすべてのスレッドを30分後に即座に停止する必要がありますが、私が知っているように、« awaitTermination»interrupt()はループまたは待機でのみ機能するメソッドのみを使用します. したがって、この瞬間が発生した場合、タイムアウトは機能しません。それで、どうやって?

0 投票する
3 に答える
16440 参照

java - 固定スレッドプールとスケジュール済みスレッドプールの Java の違い

いつでも (キューを使用して) 7 つの同時スレッドを実行する固定スレッド プールがあり、それを 7 つの同時ジョブのみを実行するが、より多くのキュー/スケジュールを設定できるスケジュールされたスレッド プールに変換したいと考えています。

ドキュメントを読んでも、あまり役に立ちませんでした..

newFixedThreadPool

public static ExecutorService newFixedThreadPool(int nThreads)

無制限の共有キューで動作するスレッドの固定セットを再利用するスレッド プールを作成します。シャットダウン前の実行中に障害が発生していずれかのスレッドが終了した場合、後続のタスクを実行する必要がある場合は、新しいスレッドが代わりに使用されます。

パラメータ: nThreads - プール内のスレッド数 戻り値: 新しく作成されたスレッド プール

newScheduledThreadPool

public static Sc​​heduledExecutorService newScheduledThreadPool(int corePoolSize)

指定された遅延後にコマンドを実行するか、定期的に実行するようにコマンドをスケジュールできるスレッド プールを作成します。

パラメータ: corePoolSize - アイドル状態であっても、プールに保持するスレッドの数。戻り値: 新しく作成されたスケジュールされたスレッド プール

私が理解していないのは、corePoolSize と nThreads は同じものですか? スケジュールされたスレッド プールは本当に固定スレッド プールのサブセットですか? つまり、スケジュールされたスレッド プールを遅延タスクをキューに入れることができる固定スレッド プールとして使用できますか?

0 投票する
20 に答える
159521 参照

java - ExecutorService のスレッドとスレッドプールの命名

Executorフレームワーク自体を利用するアプリケーションがあるとしましょう

このアプリケーションをデバッガーで実行すると、次の (既定の) 名前でスレッドが作成されます: Thread[pool-1-thread-1]. ご覧のとおり、これはあまり役に立ちません。私が知る限り、Executorフレームワークは、作成されたスレッドまたはスレッドプールに名前を付ける簡単な方法を提供していません。

では、スレッド/スレッドプールに名前を付けるにはどうすればよいでしょうか? たとえば、Thread[FooPool-FooThread].

0 投票する
3 に答える
12967 参照

java - ExecutorService でスレッドの名前を変更するには?

ExecutorService を使用していくつかの Callable を実行していますが、スレッドの名前は fixed-pool-1-thread-1 のようになっています。

スレッドの名前を変更するにはどうすればよいですか? それが不可能な場合、threadS の名前を設定できる Callables を実行する別の方法はありますか?

0 投票する
2 に答える
580 参照

java - Java ScheduledThreadPool マルチスレッドがしばらくすると停止する

異なるサーバー上の 4 つのデータベースに保存されている 184 台の車の GPS 情報を同期する J2SE アプリを開発しています。車ごとにスレッドを作成し、ScheduledThreadPool に保存します

緯度と経度の情報は XML データで SocketServer によって取得されるため、SyncThread クラス内で Socket をインスタンス化し、情報を要求してその接続を閉じ、これを 15 分ごとに行います...

アプリは何らかの理由でうまく機能し始め、ある時点で例外なしで実行を停止します...

jar は Windows サービスとして実行されています。