問題タブ [executors]

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 投票する
1 に答える
1458 参照

java - FutureTasks と CachedThreadPool はどのように機能しますか

現在、次のことを行うコードがあります。

私が抱えている問題は、将来のタスクのそれぞれが計算を行うときにかかる時間を出力することです。たとえば、コンソールに表示されます

ただし、合計時間 ( System.out.println(time taken)) は、将来のタスクにかかる最長時間よりもはるかに長いため、この例に沿って、メソッド do は約 1 分かかります (first_task の 20 秒と比較して)。

これらの将来のタスクは並行して実行されているという印象を受けましたが、タイミングからすると、次から次へと実行されているように見えます。この API を正しく使用していますか?

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

java - Javaスレッドまたはエグゼキュータのヘルプ:複数のMySQLの選択、挿入、更新を同時に実行する

MySQLデータベースを分析するアプリケーションを作成していますが、複数のDMLを同時に実行する必要があります。例えば:

それぞれがデータベースへの独自の接続を持つデータオブジェクトの配列を宣言しています。これにより、データ分析のためにいくつかのメソッドが呼び出されます。問題は、すべてのスレッドが同じ接続を使用するため、すべてのタスクが例外をスローすることです。「ロック待機タイムアウトを超えました。トランザクションを再開してみてください」

特定のオブジェクトが独自の接続を持ち、他のオブジェクトから独立して必要なタスクを実行するような方法でコードを記述する方法があると思います。例えば:

私を正しい方向に向けてもらえますか?

ありがとう

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

java - スレッドプールからスレッドIDを取得するにはどうすればよいですか?

タスクを送信する固定スレッドプールがあります(5スレッドに制限されています)。これらの5つのスレッドのどれが私のタスクを実行しているかをどのように見つけることができますか(「 5のスレッド#3がこのタスクを実行している」など)?

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

java - エグゼキュータによるJavaスレッドの再利用

私は次の点で混乱しています:
Java プログラムでスレッドを使用するための最も簡単な方法は、Thread クラスを拡張し、実行可能なインターフェースを実装する (または単に実行可能なものを実装する) ことです。
スレッドの実行を開始します。スレッドのメソッド start() を呼び出す必要があります。これにより、スレッドのメソッド run() が呼び出されます。そして、スレッドが開始されます。
メソッド start() (私が間違っていない限り)は、スレッドごとに1 回だけ正確に呼び出す必要があります。その結果、スレッドの再利用のカスタム実装を容易にする無限ループの短い部分で run メソッド自体が何らかの方法で実行されない限り、スレッド インスタンスを再利用することはできません。
現在、javadoc リンクテキスト

実行する呼び出しは、利用可能な場合、以前に構築されたスレッドを再利用します

これがどのように実装されているかわかりません。executor メソッドの execute メソッドで、カスタム スレッドを提供します。

エグゼキュータ フレームワークに委任したこのカスタム スレッドを再利用するにはどうすればよいですか?
Executor はメソッド start() を複数回呼び出すことができますが、プログラムではできませんか? 私は何か誤解していますか?

ありがとうございました。

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

scala - エグゼキュータはタイムアウト値より長く実行されます

これがscalaのコードセグメントです。タイムアウトを100ミルに設定しました。10000ループのうち、106ループは例外をスローせずに100ミル以上を実行します。最大のものは135ミルですらあります。これが起こっている理由は何ですか?

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

java - Javaエグゼキュータが特定の瞬間に実行しているタスクを確認する簡単な方法はありますか?

私はこれを理解することを可能にする何かを一緒にハックできると確信していますが、私がちょうど欠けているすぐに使える解決策があることを望んでいます。ドキュメントを読みましたが、何も表示されませんでした。

私の特定のアプリは、にThreadPoolExecutor裏打ちされたものを使用しDelayQueueていますが、それが重要かどうかはわかりません。

ありがとう!

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

java - 問題が発生して再試行したい場合、同じ Executor で Runnable を再キューイングすることは安全ですか、または推奨されますか?

run()ランナブルのメソッドに次のコードを書きました。

ご覧のとおり、タスクが DB 接続を取得できない場合は、実行前と同じキューに再エンキューする必要があります。

これはおそらく安全だと思いますが、おかしい気がします。見逃している問題がないことを確認したいだけです。

ありがとう!

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

java - DelayQueue に基づく ThreadPoolExecutor を作成できないのはなぜですか?

ThreadPoolExecutor を作成しようとしています:

コンパイラは「シンボルが見つかりません」と言っています:

しかし、私は理解していません—DelayQueue実装するので、このコンストラクターBlockingQueueを使用できるべきではありませんか?

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

java - 他のスレッドと競合している ThreadPoolExecutor スレッド

私は、既存の Java アプリケーションの拡張に取り組んでいます。このアプリケーションは、毎日数百万のメッセージを処理するメッセージ プロセッサです。基本的に Core Java を使用して記述され、スレッドとキューは Collection クラスを使用して実装されます。

このアプリケーションでは、ある種のメッセージが単一のスレッドで実行されています。デュアル プロセッサを使用しているため、アプリケーションのこの特定の部分をマルチスレッド化して、メッセージをより高速に処理するというタスクが与えられました。

Java 5 を使用しているため、ThreadPoolExcecutor を使用するアプローチを取りました。特定のスレッドのメッセージを独自のスレッドで処理できるように、クライアントごとにプロセッサ スレッドを作成しました。プロセッサ スレッドは Callable インターフェイスを実装しています。これにより、前のタスクが終了したかどうかにかかわらず、将来のオブジェクトを確認できるようになります。

初期化プロセス中に、すべてのクライアントを調べて、それぞれのプロセッサ スレッドを作成し、ID を一意のキーとして使用してマップに格納します。以前に送信されたジョブを追跡するために、同じ ID を一意のキーとして使用して、将来のオブジェクトを別のマップに再度保持します。

以下は、私が使用したコードの一部です: メインクラスで -

プロセッサ スレッド

問題

上記の実装は、私のテスト環境でうまく機能しています。ただし、本番環境 ( Edit#1 - Ubuntu、Linux Slackware、Java - 1.6.0_18) では、この新しい ThreadpoolExecutor で管理されていないアプリケーションの他のスレッドが影響を受けていることがわかりました。つまり、彼らのタスクは何時間も遅れています。ThreadPoolExecutors によって作成されたスレッドがすべてのリソースを使用しており、他のスレッドにチャンスを与えていないためでしょうか。

ThreadPoolExceutor を使用して作成された新しいスレッドは、独立したタスクを実行しており、リソースを求めて他のスレッドと競合していません。つまり、競合状態のシナリオはありません。

ログを見ると、新しいスレッドの場合、最大 20 のスレッドが実行されており (corepoolsize)、拒否の例外がないことがわかります。つまり、送信数がキューの境界内にあるということです。

なぜこれが起こっているのですか?

前もって感謝します。

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

java - スレッドセーフな方法で ThreadpoolExecutor の基になるキューにアクセスする方法

getQueue() メソッドは、ThreadPoolExecutor 内の基礎となるブロッキング キューへのアクセスを提供しますが、これは安全ではないようです。

この関数によって返されたキューをトラバーサルすると、ThreadPoolExecutor によってキューに対して行われた更新が失われる可能性があります。

「メソッド getQueue() を使用すると、監視とデバッグの目的で作業キューにアクセスできます。他の目的でこのメソッドを使用することは強くお勧めしません。」

ThreadPoolExecutor が使用する workQueue をトラバースしたい場合はどうしますか? または、代替アプローチはありますか?

これは、の続きです.. 生産者消費者問題のバリアントのデータ構造の選択

現在、複数のプロデューサーと複数のコンシューマーを試していますが、スレッドプールを自分で管理したくないため、既存のスレッドプールを使用したいと考えています。スレッドセーフな方法で、「進行中のトランザクション」データ構造。