問題タブ [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エグゼキュータが特定の瞬間に実行しているタスクを確認する簡単な方法はありますか?
私はこれを理解することを可能にする何かを一緒にハックできると確信していますが、私がちょうど欠けているすぐに使える解決策があることを望んでいます。ドキュメントを読みましたが、何も表示されませんでした。
私の特定のアプリは、にThreadPoolExecutor
裏打ちされたものを使用しDelayQueue
ていますが、それが重要かどうかはわかりません。
ありがとう!
task - Guice:プロバイダーのインジェクター
一般的に、インジェクターはすべてのアプリケーションで1回だけ使用する必要があることを知っています(起動時)。しかし、私には次のユースケースがあります。Executorのタスク実装を注入すると、そのタスク内に依存関係(たとえばFileHandler
)があり、毎回インスタンス化する必要があります。FileHandlerProvider
私は、要求されるたびに新しいインスタンスを返すプロバイダー(たとえば)を注入する方法を知っています。問題はFileHandler
、それ自体に多くの依存関係があることです(たとえばParser
、OutputPrinter
...)。今では、それらも毎回新しいインスタンスを必要とします(実装にはカウンターなどの状態があり、次のスレッドの実行時に同じインスタンスを再利用することが問題になるため)。重要なのは、プロバイダーが注入された後、プロバイダーの同じインスタンスが再利用されるため、新しいFileHandler
ものは常に同じもので作成されParser
、OuputPrinter
。解決策は、パーサーとインの代わりにParserProvider
インジェクトすることですが、それは正しくありません。依存関係が増えるため、すぐに複雑になりすぎます。私が今見ている唯一の簡単な解決策は、でInjectorを使用することです。これにより、新しいインスタンス(および依存関係の新しいインスタンス)が返されます。それとも、この状況で別のよりエレガントな解決策がありますか?OutputPrinterProvider
OuputPrinter
FileHandlerProvider
FileHandlerProvider
FileHandler
java - ThreadPoolExecutorに送信されてからキャンセルされるFutureTaskのガベージコレクションを確実にするにはどうすればよいですか?
私はCallable
オブジェクトをに送信していますがThreadPoolExecutor
、それらはメモリに残っているようです。
Eclipse用のMATツールでヒープダンプを見ると、Callable
オブジェクトがFutureTask$Sync
の呼び出し可能な変数によって参照されていることがわかります。これは、の同期変数FutureTask$Sync
によって参照されます。これは、のthis$0変数によって参照されます。FutureTask
FutureTask
FutureTask$Sync
私はこれについて読んだことがあり(ここ、ここ、そしてSOで) 、呼び出し可能オブジェクトが's submit()FutureTask
にラップされThreadPoolExecutor
、呼び出し可能オブジェクトへの参照を永久に保持しているようです。
私が混乱しているのは、FutureTask
ガベージコレクションを確実に取得して、呼び出し可能オブジェクトをメモリに保持し続けないようにし、呼び出し可能オブジェクトがメモリに保持している可能性のあるものを保持する方法です。
私の特定の状況について詳しく説明するためにThreadPoolExecutor
、必要に応じて送信されたすべてのタスクをキャンセルできるように実装しようとしています。私はSOや他の場所で見つけたいくつかの異なる方法を試しました。たとえば、エグゼキュータを完全にシャットダウンし(などで)、先物のリストを保持し、それらすべてに対してキャンセルを呼び出してから、shutdown()
先物のリストをクリアします。理想的には、シャットダウンする必要はなく、必要に応じてクリアする必要があります。shutdownNow()
submit()
cancel()
これらの方法のすべてが違いを生むわけではないようです。呼び出し可能オブジェクトをプールに送信すると、それが固執してしまう可能性が高くなります。
私は何が間違っているのですか?
ありがとう。
編集:
要求に応じて、これがThreadPoolExecutorのコンストラクターです。
さらにテストした後、ThreadPoolExecutorに送信されたタスクを終了させても、リークがないことがわかります。とにかくそれらをキャンセルしようとすると:
または、将来への参照を保存し、後でキャンセルを呼び出す:
または、次のような方法でキューから削除します。
また
または先物への保存された参照をループして呼び出します:
これらのケースのいずれかにより、FutureTaskは上記のように固執します。
したがって、これらすべての本当の問題は、FutureTaskがガベージコレクションされ、永久にリークされないように、ThreadPoolExecutorからアイテムを適切にキャンセルまたは削除する方法です。
java - Callableが特定の結果を返したらExecutorを停止します
Executorに送信された場合でも、ExecutorがFutureオブジェクトを実行しないようにしたいのですが。エグゼキュータを介して複数のスレッドを実行することはすべて正常に機能しますが、Callableのいずれかがブール値のTRUEを返したときにエグゼキュータを停止する必要があります。現在実行中のFutureが完了したことは問題ありませんが、残りを続行するのは時間の無駄です。
MathCalculationがCallableインターフェイスを実装し、そのcall()メソッドがブール値を返す場合。
セットが非常に大きくなり、マルチスレッドの状況のために明らかに機能しないため、各反復でcalculationSetを検索することはオプションではありません。これを達成する方法はありますか?
java - Tomcat で ThreadPool Excutor サービスを使用してリクエストを高速化する
Tomcat6 サーブレット アプリケーションがあります。私の要求の 1 つ (平均 10 秒以下) は、マルチスレッドを使用することで大幅に改善できます。これは、CPU のみのタスクであり、コアが 8 つ以上あるためです。そうするのが賢いのか、それとも単に表面的な変更なのか、私はただ疑問に思います:
もちろん、単一ユーザーの場合は改善されます。しかし、負荷が増加するとどうなりますか?現在、いくつかの HTTP コネクタ スレッド間で共有されている CPU パワーには限りがあります。それらを最適に構成したと仮定すると、この単一の (しかし重要な) 操作を高速化するために、http コネクタ スレッド プールからいくつかのスレッドを取得し、それをエグゼキュータ サーバーに配置する必要があります。
私の推測では、負荷が増加すると、追加のスレッド化されたエグゼキューター サービスを使用すると、システムのパフォーマンスが低下するということです。
私の問題がわかりますか?誰かがベストプラクティスのアイデアを持っていますか? それとも私が見落とした何か?
java - 軽量で折りたたみ可能なExecutorの実装?
Android用のモバイルアプリを作成していますが、リストアダプターごとにHTTPリクエストをプールする必要があります。基本的にExecutorService
「崩壊」する実装が必要です。つまり、最大n個のスレッドを使用しますが、スレッドが完了するとすぐに期限切れになり、非常に軽量になります。需要が高い場合は、タスクをキューにダンプして、スレッドが使用可能になるのを待ちます。自分で書くことなくこれを行う方法はありExecutorService
ますか、それとも手を汚してそれを行うべきですか?
python - それは私だけですか、それともWindowsの新しいPython先物モジュールに深刻な問題がありますか
私はWindowsXPを使用していますが、新しいPython3.2futuresモジュールに問題があります。仕事ができないようですProcessPoolExecutor
。セッションの例:
ここで何かがおかしいようです。
java - java-Executor フレームワーク
私の次のコードを見てください....
//追加した
この部分で、100 レコードのエグゼキューターを持つ結果セット ( rs ) が 100 スレッドを作成している場合..... このプロセスを 10 スレッドで実行する必要があります。スレッドの制御を取得する方法を知るためにあなたの助けが必要です.. いずれかのスレッドがそのタスクを完了した場合、そのスレッドは結果セットからすぐに利用可能なタスクを処理する必要があります. エグゼキューターフレームワークを使用して達成することは可能ですか?
ありがとう...
vijay365
java - アプリケーションの終了時に Executor を手動でシャットダウンする必要はありますか?
Executor executor;
アプリケーションのどこかに があるとします。setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
いつものように言って「システム」に処理させるだけで十分ですか、それともリスナーを登録しexecutor.shutdown();
てアプリケーションが終了する前に手動で呼び出す必要がありますか?
java - 複数の同時クライアントを処理するための Java サーバーの作成
複数のクライアントを同時に処理する Java サーバーを構築する際にアドバイスが必要です。クライアントは、かなり長い時間接続を維持する必要があります。私は現在、ブロッキング IO を使用し、サーバーに接続する各クライアントから読み取るスレッドを生成していますが、これは明らかにスケーラブルではありません。
固定サイズのスレッド プールで Selector または Executor を使用するなど、いくつかのオプションを見つけました。私はどちらにもあまり詳しくないので、ここではどちらが最善の解決策でしょうか? ありがとう!