問題タブ [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.
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()
か?
関連している
この質問(プロデューサー/コンシューマーワークキュー)も同様ですが、キューに直接追加することについては特に説明していません。
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は見当たりません。
前もって感謝します。
java - スレッド終了時のJavaExecutorServiceコールバック
キャッシュされたスレッドプールExecutorServiceを使用して、非同期のバックグラウンドタスクを実行しています。スレッドをExecutorServiceに渡すThreadFactoryを提供しました(必要なときはいつでも)。キャッシュされたスレッドプールについての私の理解は、スレッドが60秒間アイドル状態になった後、ExecutorServiceによって終了されるということです。
スレッドが終了しようとしているときに、状態のクリーンアップを実行したいと思います。これを達成するための最良の方法は何ですか?ExecutorServiceは、スレッドのライフサイクルへのフックを容易に提供しません。
ExecutorServiceをシャットダウンしたくありません-タスクが発生したときにタスクを実行するのに便利です。
ありがとう、
シュレヤス
java - ScheduledExecutorService の再利用
だから、私は次のものを持っているとしましょうScheduledExecutorService
:
現在は、定期的なタスク (ディレクトリ ポーリングなど)exec
を実行するために使用されます。しかし、この 1 つのタスク (つまり) は1 回実行されますが、遅延が必要です。それで、このタスクを実行するために使用することにしましたが、これは良い設計ですか? 代わりに、 を作成してから を呼び出す必要がありましたか? 例えば、executeOnce
exec
newSingleThreadExecutor
shutdown
後者を実装するメリットはありますか?
java - さまざまなスレッドによってアップロードされているファイルを追跡する
Javaでは、ファイルのディレクトリを保持し、要求に応じて他のFileManagerにアップロードするFileManagerを作成しようとしています。アップロード要求が(ソケットを介して)着信するたびに、要求されたファイルのアップロードを処理するための新しいスレッドが作成されます。
私はこれに対処するためにExecutorService
とを使用することを考えていました。FileUploader implements Runnable
つまり、セッションがExecutorServiceであり、mySocketがFileManagerが要求をリッスンしているソケットである場合、各スレッドの作成は次のようになります。
問題は、FileManagerがデータベース内のファイルの名前を変更するコマンドを取得した場合、ファイルの名前を変更する前に、現在ファイルをアップロードしているすべてのスレッドが終了するのを待つ必要があることです。
問題は、特定のファイルをアップロードしているスレッドの数/スレッドを追跡するにはどうすればよいかということです。
java - Java: ExecutorService スレッドの強制停止
私のコード:
しかし、トレントのダウンロードには不明な時間値がかかり、« awaitTermination
» が思い通りに動作しないことがあります。実行されたすべてのスレッドを30分後に即座に停止する必要がありますが、私が知っているように、« awaitTermination
»interrupt()
はループまたは待機でのみ機能するメソッドのみを使用します. したがって、この瞬間が発生した場合、タイムアウトは機能しません。それで、どうやって?
java - 固定スレッドプールとスケジュール済みスレッドプールの Java の違い
いつでも (キューを使用して) 7 つの同時スレッドを実行する固定スレッド プールがあり、それを 7 つの同時ジョブのみを実行するが、より多くのキュー/スケジュールを設定できるスケジュールされたスレッド プールに変換したいと考えています。
ドキュメントを読んでも、あまり役に立ちませんでした..
public static ExecutorService newFixedThreadPool(int nThreads)
無制限の共有キューで動作するスレッドの固定セットを再利用するスレッド プールを作成します。シャットダウン前の実行中に障害が発生していずれかのスレッドが終了した場合、後続のタスクを実行する必要がある場合は、新しいスレッドが代わりに使用されます。
パラメータ: nThreads - プール内のスレッド数 戻り値: 新しく作成されたスレッド プール
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
指定された遅延後にコマンドを実行するか、定期的に実行するようにコマンドをスケジュールできるスレッド プールを作成します。
パラメータ: corePoolSize - アイドル状態であっても、プールに保持するスレッドの数。戻り値: 新しく作成されたスケジュールされたスレッド プール
私が理解していないのは、corePoolSize と nThreads は同じものですか? スケジュールされたスレッド プールは本当に固定スレッド プールのサブセットですか? つまり、スケジュールされたスレッド プールを遅延タスクをキューに入れることができる固定スレッド プールとして使用できますか?
java - ExecutorService のスレッドとスレッドプールの命名
Executor
フレームワーク自体を利用するアプリケーションがあるとしましょう
このアプリケーションをデバッガーで実行すると、次の (既定の) 名前でスレッドが作成されます: Thread[pool-1-thread-1]
. ご覧のとおり、これはあまり役に立ちません。私が知る限り、Executor
フレームワークは、作成されたスレッドまたはスレッドプールに名前を付ける簡単な方法を提供していません。
では、スレッド/スレッドプールに名前を付けるにはどうすればよいでしょうか? たとえば、Thread[FooPool-FooThread]
.
java - ExecutorService でスレッドの名前を変更するには?
ExecutorService を使用していくつかの Callable を実行していますが、スレッドの名前は fixed-pool-1-thread-1 のようになっています。
スレッドの名前を変更するにはどうすればよいですか? それが不可能な場合、threadS の名前を設定できる Callables を実行する別の方法はありますか?
java - Java ScheduledThreadPool マルチスレッドがしばらくすると停止する
異なるサーバー上の 4 つのデータベースに保存されている 184 台の車の GPS 情報を同期する J2SE アプリを開発しています。車ごとにスレッドを作成し、ScheduledThreadPool に保存します
緯度と経度の情報は XML データで SocketServer によって取得されるため、SyncThread クラス内で Socket をインスタンス化し、情報を要求してその接続を閉じ、これを 15 分ごとに行います...
アプリは何らかの理由でうまく機能し始め、ある時点で例外なしで実行を停止します...
jar は Windows サービスとして実行されています。