問題タブ [executor]
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 - Java Executor: 小さなタスクか大きなタスクか?
独立して実行可能な数百の小さなタスクに分割できる 1 つの大きなタスクを考えてみましょう。より具体的には、それぞれの小さなタスクは、軽いネットワーク リクエストを送信し、サーバーから受信した応答を決定することです。これらの小さなタスクは 1 秒以上かかるとは予想されず、合計で数台のサーバーが関与します。
私は Executor フレームワークを使用してこれを実装する 2 つのアプローチを念頭に置いています。
- いくつか、たとえば 5 ~ 10 個のタスクを作成し、それぞれに一連の送受信を行います。
- 送信と受信ごとに 1 つのタスク (Callable または Runnable) を作成し、それらすべて (数百) をエグゼキューターによって実行するようにスケジュールします。
私の質問が、これらをテストして何が優れているかを自分で確認するのが面倒だと示している場合は申し訳ありません (少なくともパフォーマンスに関しては)。私の質問は、この特定のケースへの回答を見ながら、より一般的な側面を持っています。このような状況で、エグゼキュータを使用してすべてのスケジューリングやその他の処理を実行したい場合、小さなタスクをたくさん作成するのと、それらを少数の大きなタスクにグループ化するのとではどちらがよいでしょうか?
java - JavaでCPUベースのタスクを実行する単純なプログラムに最適なスレッドプールサイズはどれくらいですか
スレッドプールを使用してタスクを実行しています。ほとんどの場合、CPUの数より1大きいサイズのI/Oのビットに基づくCPUです。
すべてのタスクをこのエグゼキュータに送信し、他にほとんど何もしない単純なプログラムの場合、OSがCPUをタイムスライスする必要があるため、スレッドプールをこれ以上大きくすると、処理が遅くなると想定します。走る。
それは正しいですか。そうであれば、これは実際の問題であるか、ほとんど理論上の問題です。つまり、スレッドプールのサイズを1000に増やした場合、大きな違いに気付くでしょう。
java - 実行時間が長すぎる場合、executorserviceを使用して特定のスレッドを強制終了できますか?
これまでのところ、executorserviceを使った実験では、future.get、次にfuture.cancelを使用してスレッド割り込みをスローすることに関する多くのアドバイスがありました。この割り込みは、スレッドにキャッチされ、そこで処理される必要があります。私の質問は少し異なります。
実行時間の長さを追跡するだけのスレッドを実行していて、しきい値を超えた場合、これはexecutorserviceと実行中のすべてのスレッドを強制終了するための良い方法でしょうか?
思考プロセスの例:
これは機能しますか?スレッドが非常にまれに失敗するため、確認する方法がありません(約1/700の実行、および1日の特定の時間にのみ実行されます)。
java - scheduleThreadPoolExecutor の Future への参照を取得する方法
スケジュールされたエグゼキューター サービスがあり、タスクがスケジュールされた後に Future を返す必要があります。Javadoc には、タスクをスケジュールした後に ScheduledFuture が返されると書かれていますが、まだ実行されていないタスクの後続の Future を取得するにはどうすればよいですか?
私の呼び出しは次のようになります: exec.scheduleAtFixedRate(new Task(), 0, interval, TimeUnit.MINUTES);
新しいタスクは実際に送信されて実行されますが、呼び出しが初めて行われる未来しかありません。この Future は再利用されるものですか、それとも再利用可能なものですか?
java - Java-プールサイズはわかっているがワーカーが不明なFixedThreadPool
したがって、固定スレッドプールがどのように機能するか(Javaに組み込まれたExecutor.fixedThreadPoolを使用)はある程度理解していると思いますが、私が見ることができることから、通常は実行したいジョブの数が設定されており、開始時にいくつになるかがわかります。プログラム。例えば
各workerThreadが本当に単純なことを行う場合、その部分は任意です。私が知りたいのは、プールサイズが固定されている(たとえば最大8)が、実行時までタスクを完了するために必要なワーカーの数がわからない場合はどうなるかということです。
具体的な例は次のとおりです。プールサイズが8で、標準入力から読み取っている場合。読みながら、入力を設定されたサイズのブロックに分割しました。これらのブロックのそれぞれは、圧縮できるように(他の情報とともに)スレッドに渡されます。そのため、入力の最後に到達するまで続行する必要があるため、作成する必要のあるスレッドの数がわかりません。また、データが同じ順序に保たれるようにする必要もあります。スレッド2がスレッド1の前に終了し、その作業を送信しただけの場合、私のデータは故障します!
この状況では、スレッドプールは間違ったアプローチでしょうか?それは素晴らしいことのようです(一度に8つ以上のスレッドを使用することはできないので)。
基本的に、私はこのようなことをしたいと思います:
これは機能するコードではありませんが、私は自分が欲しいものを説明しようとしているだけです。
少し省略しましたが、buffとdictの値がどのように変化するか、入力の長さがわからないことを確認してください。最初の電話の後ですでによく働く人がいるので、私は実際にこの考えをすることができないと思います!私はworker=new WorkerThreadと言うことはできません。なぜなら、それはすでに既存のスレッド(true、死んでいる可能性のあるスレッド)を指しているのではないからです。明らかに、この実装では、それが機能した場合、私は実行しません。並行して。しかし、私のポイントは、最大プールサイズに達するまでスレッドを作成し続け、スレッドが完了するまで待ってから、入力の最後に達するまでスレッドを作成し続けることです。
また、物事を整理する必要があります。これは本当に厄介な部分です。
java - エグゼキュータを再初期化する際のベストプラクティス
を使用して複数のタスクを実行するSwing
アプリケーションがあります。ThreadPoolExecutor
ある時点で、すべてを再初期化したいです。私が使用しているexecutor.purge();
と executor.getQueue().clear()
; これで十分ですか?これを実行するためのより良い方法/実践はありますか?前もって感謝します。
spring - grails executor プラグイン - executorService インジェクション
サービスで executorService インジェクションを使用しようとしていますが、失敗します。プラグインのドキュメントを読むと、executorService が conf/spring/resources.groovy ファイルを介して注入されることが記載されています。しかし、私の resources.groovy ファイルは空 (実際には空の Bean 定義) であり、そこに何かを入れる必要があるかどうかわかりません。
私は何が欠けていますか?
java - タスク チェーンのシャットダウンを伴う ExecutorService
ExecutorService
ExecutorService に新しいタスクを送信するタスクを実行する があります。
を呼び出すと.shutdown()
、実行中のタスクが新しいタスクを ExecutorService に送信できるようになり、終了する必要があります。しかし、新しいタスクを外部から に送信できるようにしたくありませんExecutorService
。
ExecutorService
のシャットダウン時にタスクがサブタスクをサブミットできるようにするにはどうすればよいですか?
java - ExecutorServiceをキャンセルして再利用する方法はありますか?
私はJavaフラクタルエクスプローラーを書いていますが、フラクタル計算はマルチスレッドで行われます。以前は、多数のスレッド(システムにプロセッサコアがある数)を作成して配列に保持していましたが、これによりいくつかの問題が発生し、あまりエレガントではないため、エグゼキュータに切り替えたいと思います。
必要な機能は次のとおりです。
- ユーザーはいつでもフラクタル画像の新しい領域を選択してズームインできるため、いつでも計算をキャンセルして、すぐに新しいタスクを再挿入できるはずです。
- パフォーマンスを向上させるには、スレッドを再利用する必要があります(キャンセル後も存続します)
私の問題は、shutdownNow()の呼び出し(キャンセル)後に新しいタスクを送信すると、Java ExecutorService(Executors.newFixedThreadPool()を使用)が例外をスローすることです。もちろん、新しいExecutorServiceを作成することもできますが、その場合はすべてのスレッドを再度作成する必要があります。これは、私が理解している限り、非常にコストがかかります(これがスレッドプールを使用するポイントです)。
つまり、基本的に必要なのは、シャットダウンせずにキャンセルできるスレッドプールを使用したExecutorServiceの実装であり、再利用できます。
すでにそのようなものはありますか、それとも私はそれを自分で書く必要がありますか?(難しいことはありませんよね?;))
私の現在のコードはhttps://github.com/lucaswerkmeister/JFractalizerにあります。
前もって感謝します、
ルーカス
PS:エグゼキュータを使用する場合、スレッドよりも多くの部分に画像を分割するため、1つの部分がはるかに速く終了した場合、スレッドはアイドル状態ではなく、代わりに画像の別の部分に進むことができます。それでも、すべての部分が並行して計算され、一部が他の部分より遅く開始されない場合はクールですが、それは単なるボーナスです。
android - Androidでの複数の同時HTTPリクエスト
したがって、AsyncTask内に以下のコードがあり、7つの異なる非同期HTTPリクエストを呼び出したいと思います。すべてがうまく機能し、7つのexecute()メソッドすべてが同時に開始します(数ミリかかるので、これは素晴らしいことです)。
残念ながら、この方法にかかる時間はおよそです。16秒 すべてのエグゼキュータのものを除外し、元のワーカーAsynctaskでHTTPダウンロードメソッドを呼び出すと、約がかかります。9秒 そのため、実際には、同時ではなく順次の方が時間がかかりません。なぜこれが起こっているのか考えはありますか?たぶんサーバー側に何かありますか?おそらく、エグゼキュータが非同期タスクで開始されたためですか?どうもありがとう !