問題タブ [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 - Gridgain エグゼキュータ サービス
GridGain の GridExecutorService を使用してリモートでジョブを実行することと、@Gridify アノテーションを使用することの利点は何ですか?
java.lang.concurrent.ExecutorService のインスタンスをクラスに渡すことができ、グリッド フレームワークに依存しませんが、機能が失われますか?
java - Javaエグゼキュータ:タスクの終了を待ちます。
いくつかのタスクを送信してから、すべての結果が利用可能になるまでそれらを待つ必要があります。それぞれがにを追加しString
ますVector
(デフォルトで同期されます)。次に、Vectorの結果ごとに新しいタスクを開始する必要がありますが、これを行う必要があるのは、前のすべてのタスクがジョブの実行を停止した場合のみです。
Java Executorを使用したいのですが、特にExecutors.newFixedThreadPool(100)
固定数のスレッドを使用するために使用しようとしました(10または500の可変数のタスクがあります)が、executorを初めて使用するため、方法がわかりません。タスクの終了を待ちます。これは、私のプログラムが実行する必要があることの擬似コードのようなものです。
しばらくしていて(true)、再利用する必要があるため、e.shutdownを実行できませんexecutorService
...
手伝って頂けますか?Javaエグゼキュータに関するガイド/本を提案してもらえますか?
java - Javaエグゼキュータ:送信されたタスクを停止するにはどうすればよいですか?
エグゼキュータを使用してタスクを送信しましたが、しばらくすると(たとえば、5分)停止する必要があります。私はこのようにしてみました:
しかし、常にエラーが発生します。タスクによって変更してからスレッドで読み取る必要がある共有ベクターがあり、すべてのタスクを停止しても、タイムアウトが発生すると、次のようになります。
何か問題がありますか?5分経ってもまだ機能している送信済みのタスクを停止するにはどうすればよいですか?
java - すべてのスレッドがいつ完了するかを把握し、例外を処理する
私は Executor フレームワークを使用して、スレッドプール、つまり newFixedThreadPool を使用して複数のスレッドを開始しています。threadpool.submit(aThread) を使用して、スレッドプールによって実行されるジョブを送信しますが、これは正常に機能しますが、他の処理を続行できるように、すべてのスレッドがいつ完了するかを判断する必要があります。スレッドが完了するまでブロックする Future.get() の使用を検討しました。ここでの問題は、結果が得られるまでブロックすることです。また、すべてのスレッドが完了しているかどうかを確認するために、シャットダウンを発行した後に isTerminated() メソッドを継続的に呼び出してからスリープ状態にすることも検討しましたが、これはうまくいきません。これに別のよりクリーンな方法はありますか?また、スレッドのいずれかで例外が発生した場合は、実行中の他のすべてのスレッドを終了し、プール内のキューに入れられたスレッドの開始を停止できるようにしたいと考えています。これを行うための最良のメカニズムは何ですか?
返信をお待ちしております
ティア
java - 可変遅延の ScheduledExecutorService
java.util.concurrent.BlockingQueue から要素を取得して処理するタスクがあるとします。
頻度を動的に変更できる場合、タスクをスケジュールまたは再スケジュールするにはどうすればよいですか?
- アイデアは、データ更新のストリームを取得し、それらをバッチで GUI に伝達することです。
- ユーザーは更新の頻度を変更できる必要があります
java - ExecutorServiceの驚くべきパフォーマンスの損益分岐点---経験則?
Javaのエグゼキュータを正しく使用する方法を理解しようとしています。にタスクを送信することにExecutorService
は、独自のオーバーヘッドがあることに気付きました。しかし、それがそれと同じくらい高いのを見て私は驚いています。
私のプログラムは、可能な限り低いレイテンシで大量のデータ(株式市場データ)を処理する必要があります。ほとんどの計算は、かなり単純な算術演算です。
私は非常に単純なものをテストしようとしました: " Math.random() * Math.random()
"
最も単純なテストでは、この計算を単純なループで実行します。2番目のテストは、匿名のRunnable内で同じ計算を実行します(これは、新しいオブジェクトを作成するコストを測定することになっています)。3番目のテストはに合格Runnable
しますExecutorService
(これは、エグゼキュータを導入するコストを測定します)。
私は私のちっぽけなラップトップ(2 cpus、1.5ギグラムRAM)でテストを実行しました:
(4回の実行のうち約1回、最初の2つの数値は等しくなります)
エグゼキュータは、単一のスレッドで実行するよりもはるかに長い時間がかかることに注意してください。スレッドプールのサイズが1〜8の場合、数値はほぼ同じでした。
質問:私は明らかな何かを見逃していますか、それともこれらの結果は期待されていますか?これらの結果は、エグゼキュータに渡すタスクはすべて、重要な計算を実行する必要があることを示しています。何百万ものメッセージを処理していて、各メッセージに対して非常に単純な(そして安価な)変換を実行する必要がある場合でも、エグゼキュータを使用できない可能性があります...複数のCPUに計算を分散しようとすると、単にコストがかかる可能性があります単一のスレッドでそれらを実行します。設計上の決定は、私が当初考えていたよりもはるかに複雑になります。何かご意見は?
java - ThreadPoolExecutorのキューに入れられたすべてのタスクを削除する
ThreadPoolExecutorについてこのかなり単純な質問があります。次の状況があります。キューからオブジェクトを消費し、それらに適切なワーカータスクを作成して、ThreadPoolExecutorに送信する必要があります。これは非常に簡単です。ただし、シャットダウンシナリオ内では、多くのワーカーが実行キューに入れられる場合があります。これらのタスクの1つが1時間実行されている可能性があり、アプリケーションを比較的高速で正常にシャットダウンする必要があるため、既に処理中のタスクを正常に完了する必要があるときに、キューに入れられたすべてのタスクをThreadPoolExecutorから破棄します。
ThreadPoolExecutorのドキュメントにはremove()メソッドがありますが、削除できるのは特定のタスクのみです。パージ()は、すでにキャンセルされた将来のタスクに対してのみ機能します。私のアイデアは、キューに入れられたすべてのタスクを保持しているキューをクリアすることでした。ThreadPoolExecutorはこの内部キューへのアクセスを提供しますが、ドキュメントには次のように記載されています。
getQueue()メソッドを使用すると、監視とデバッグを目的としたワークキューへのアクセスが可能になります。この方法を他の目的に使用することは強くお勧めしません。
したがって、このキューを取得してクリアすることはできません。また、このドキュメントの抜粋には次のように書かれています。
提供されている2つのメソッド、remove(java.lang.Runnable)とpurge()を使用して、キューに入れられた多数のタスクがキャンセルされた場合のストレージの再利用を支援します。
どのように?確かに、エグゼキュータに送信したすべてのタスクのリストを維持できます。シャットダウンの場合は、すべてのエントリを繰り返し処理し、remove()メソッドを使用してThreadPoolExecutorから削除します...しかし...さあ、これはこのリストを維持するためのメモリの浪費と面倒。(たとえば、すでに実行されたタスクを削除する)
ヒントや解決策に感謝します!
java - ExecutorService (具体的には ThreadPoolExecutor) はスレッドセーフですか?
スレッドの安全性はExecutorService
保証されていますか?
異なるスレッドから同じ ThreadPoolExecutor にジョブを送信しますが、タスクをやり取り/送信する前にエグゼキューターへのアクセスを同期する必要がありますか?
java - サイズ制限のあるキャッシュされたスレッドプールを作成することは不可能ですか?
作成できるスレッドの数に制限があるキャッシュされたスレッド プールを作成することは不可能のようです。
Executors.newCachedThreadPool
以下は、標準 Java ライブラリでのstatic の実装方法です。
したがって、そのテンプレートを使用して、固定サイズのキャッシュされたスレッド プールを作成します。
これを使用して 3 つのタスクを送信すると、すべてがうまくいきます。それ以上のタスクを送信すると、拒否された実行例外が発生します。
これを試す:
すべてのスレッドが順次実行されます。つまり、スレッド プールは、タスクを処理するために複数のスレッドを作成することはありません。
これはThreadPoolExecutor
?の execute メソッドのバグです。それとも、これは意図的なものですか?それとも何か他の方法がありますか?
編集:キャッシュされたスレッドプールとまったく同じものが必要です(オンデマンドでスレッドを作成し、タイムアウト後にそれらを強制終了します)が、作成できるスレッドの数に制限があり、追加のタスクをキューに入れ続ける機能が必要ですスレッド制限に達しました。sjlee の回答によると、これは不可能です。execute()
その方法を見ると、ThreadPoolExecutor
さすがに無理です。ThreadPoolExecutor
サブクラス化してオーバーライドする必要がありexecute()
ますSwingWorker
がSwingWorker
、その中で行うことexecute()
は完全なハックです。
executorservice - マルチスレッドアプリケーションでのスレッドに対するエグゼキューターの利点は何ですか?
Executor は Threads よりも優れているというコメントをいくつか見ましたが、(フローベースのプログラミングのように) バウンド バッファーを介して通信する多数の Threads がある場合、とにかく Threads を使用する必要があるのに、なぜ Executor を使用するのでしょうか (newCachedThreadPool を使用) (?))。また、isAlive()、interrupt() などのメソッドを使用しています - どうすれば Thread ハンドルを取得できますか?
誰かが私が盗用できるサンプルコードを持っていますか? ;-)