問題タブ [threadpoolexecutor]
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 - Executors.newCachedThreadPool()とExecutors.newFixedThreadPool()
newCachedThreadPool()
対newFixedThreadPool()
いつどちらを使うべきですか?リソース使用率の観点から、どちらの戦略が優れていますか?
java - サイズ制限のあるキャッシュされたスレッドプールを作成することは不可能ですか?
作成できるスレッドの数に制限があるキャッシュされたスレッド プールを作成することは不可能のようです。
Executors.newCachedThreadPool
以下は、標準 Java ライブラリでのstatic の実装方法です。
したがって、そのテンプレートを使用して、固定サイズのキャッシュされたスレッド プールを作成します。
これを使用して 3 つのタスクを送信すると、すべてがうまくいきます。それ以上のタスクを送信すると、拒否された実行例外が発生します。
これを試す:
すべてのスレッドが順次実行されます。つまり、スレッド プールは、タスクを処理するために複数のスレッドを作成することはありません。
これはThreadPoolExecutor
?の execute メソッドのバグです。それとも、これは意図的なものですか?それとも何か他の方法がありますか?
編集:キャッシュされたスレッドプールとまったく同じものが必要です(オンデマンドでスレッドを作成し、タイムアウト後にそれらを強制終了します)が、作成できるスレッドの数に制限があり、追加のタスクをキューに入れ続ける機能が必要ですスレッド制限に達しました。sjlee の回答によると、これは不可能です。execute()
その方法を見ると、ThreadPoolExecutor
さすがに無理です。ThreadPoolExecutor
サブクラス化してオーバーライドする必要がありexecute()
ますSwingWorker
がSwingWorker
、その中で行うことexecute()
は完全なハックです。
java - JavaExecutorServiceタスクからの例外の処理
ThreadPoolExecutor
Javaのクラスを使用して、固定数のスレッドで多数の重いタスクを実行しようとしています。各タスクには、例外が原因で失敗する可能性のある多くの場所があります。
私はサブクラス化し、タスクの実行中に発生したキャッチされない例外を提供することになっているメソッドをThreadPoolExecutor
オーバーライドしました。afterExecute
しかし、私はそれを機能させることができないようです。
例えば:
このプログラムからの出力は、「すべてが順調です-状況は正常です!」です。スレッドプールに送信された唯一のRunnableが例外をスローしたとしても。ここで何が起こっているのかについての手がかりはありますか?
ありがとう!
java - ThreadPoolExecutor の例外処理
基本的に実行する必要があるタスクのリストをスキャンし、各タスクをエグゼキュータに渡して実行する次のコード スニペットがあります。
次にJobExecutor
、別のエグゼキューターを作成し (db の処理を行うため...キューへのデータの読み取りと書き込みを行うため)、タスクを完了します。
JobExecutor
Future<Boolean>
サブミットされたタスクに対してa を返します。タスクの 1 つが失敗した場合、すべてのスレッドを正常に中断し、すべての例外をキャッチしてエグゼキューターをシャットダウンしたいと考えています。どのような変更を行う必要がありますか?
java - Executor をシャットダウンせずに、ThreadPoolExecutor 内のすべてのタスクが終了するのを待つ方法は?
使用できません。待機中shutdown()
にawaitTermination()
ThreadPoolExecutor に新しいタスクが追加される可能性があるためです。
そのため、ThreadPoolExecutor がキューを空にし、その時点より前に新しいタスクが追加されるのを止めることなく、すべてのタスクを終了するまで待機する方法を探しています。
違いがある場合、これは Android 用です。
ありがとう
更新:これを再訪してから数週間後、この場合、変更された CountDownLatch の方がうまく機能することがわかりました。私が尋ねたことにもっと当てはまるので、私は答えをマークしたままにします。
java - Java ExecutorService - スケーリング
ExecutorService
とその関数を使用して Java でプログラムを作成しようとしていますinvokeAll
。私の質問は次のとおりinvokeAll
です。関数はタスクを同時に解決しますか? つまり、プロセッサが 2 つある場合、同時に 2 つのワーカーが存在するということですか? 正しくスケーリングできないからです。newFixedThreadPool(2)
または 1を与えると、問題を完了するのに同じ時間がかかります。
Map
実装するクラスでCallable
ありwp
、異なる時間にいくつかの情報を保持するクラスである Partial Solutions のベクトルです。
なぜスケールしないのですか?何が問題なのですか?
これは PartialSolution のコードです。
これは Map のコードです。
したがって、マップでは、フラグメントからすべての行を取得し、出現回数ごとにすべての式を検索し、行数も保存します。すべてのフラグメントを処理した後、同じ PartialSolution で情報をハッシュ マップに保存し、新しい PartialSolution を返します。次のステップでは、PartialSolutions を同じ fileName と組み合わせて、Map と同じである Callable クラス Reduce に導入します。違いは、他の操作を行いますが、PartialSolution も返すことです。
これは、Map タスクを実行するためのコードです。
タスクでは、タイプ Map のタスクを作成し、リストではそれらを取得します。JVM スレッド ダンプの読み方がわかりません。私があなたに提供した情報で十分であることを願っています。それが助けになるなら、私は NetBeans 7.0.1 で働いています。
ありがとう、アレックス
java - Android ThreadPoolExecutor と join()
同時に実行されている複数のスレッドを持つスレッドプール エグゼキュータがあります。すべてのスレッドが完了した後にコードを実行したいと考えています。どうすればこれを達成できますか?
java - Java FixedThreadPool が設定されたプールサイズで機能しない?
ワーカー スレッドに FixedThreadPool を使用しています。作成方法は次のとおりです。
そのため、サイズを 25 に設定しました。アクティブなスレッドは常に最大 25 にすべきだと思いますか? (私が間違っている場合は修正してください)。
次に、スレッド プールにアイドル状態のスレッドがある場合、メイン スレッドは一度に 30 個のワーカー スレッドを送信しようと常に試みます。
しかし、デバッグすると、次のログが得られました。
キューは常に空で、core_pool_size は 1000 のままで、pool_size は 1000 まで増加し続けますが、core_pool_size は 25 で、キューに入れられたタスクがあるはずだと思いますか?
私は何か間違ったことをしたか、これを誤解しましたか?
どんな助けでも大歓迎です、ありがとう!
これは私がログを生成した方法です:
java - ThreadPoolExecutor とキュー
ThreadPoolExecutorを使用すると、コンストラクターで渡されるか、メソッドを使用しRunnable
て実行される s を送信できると思いました。
また、私の理解では、タスクが利用可能であれば実行されます。
私が理解していないのは次のとおりです。 BlockingQueue
execute
executor.prestartAllCoreThreads();
このコードは、コンストラクターでのコメントを解除するかexecute
、出力する実行可能ファイルを呼び出さない限り、何もしませんSystem.out.println("++++++++++++++");
(これもコメントアウトされています)。
なんで?
引用(私の強調):
デフォルトでは、コアスレッドも最初に作成され、新しいタスクが到着したときにのみ開始されますが、メソッド prestartCoreThread() または prestartAllCoreThreads() を使用して動的にオーバーライドできます。空でないキューを使用してプールを構築する場合は、おそらくスレッドを事前に開始する必要があります。
Ok。だから私のキューは空ではありません。しかしexecutor
、私はを作成し、作成してから、sleep
新しいRunnable
をキューに追加します (100 へのループ内)。
このループは とカウントされnew tasks arrive
ませんか?
なぜそれが機能しないので、明示的に呼び出すか、prestart
または明示的に呼び出す必要がありますexecute
か?