問題タブ [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 - wait() と notify() を使用してスレッドを制御する
(問題は解決しました。以下の解決策)
2 つのクラスがあります。Equip と Command です。装備はコマンドを実行する装備ですが、同時に1つのコマンドしか実行できないようにする必要があります。コマンドは run() 関数で実行されるスレッドですが、Equip は何も拡張しない通常のクラスです。現在、コマンドを実行するための次のセットアップがあります。
コマンドクラス:
装備クラス:
ただし、これは機能していません。基本的に、notify() はコマンド スレッドを起動しないため、決して実行されません。待機および通知プロトコルについて検索しましたが、コードに問題は見つかりませんでした。また、queueCommand() メソッドから直接 wait() を呼び出してみましたが、queueCommand の実行が停止し、本来の動作も実行されませんでした。このアプローチは正しいですか、何かが欠けていますか、それとも完全に間違っているので、並行スレッドを操作するために Monitor クラスを実装する必要がありますか?
編集:@Grayのおかげで、エグゼキューターを使用して、別のまったく異なるアプローチを使用して問題を解決しました。
これが最終的なコードです。いつか誰かを助けるかもしれません:
装備クラス:
private ExecutorCompletionService commandQueue = new ExecutorCompletionService(Executors.newFixedThreadPool(1));
Command クラスには、装備の execute メソッドをカプセル化するメソッドがあります。ブール型の waitCompletion は、コマンドの結果が同時に必要な場合に使用されます。新しいスレッドを呼び出して実行する代わりに、同じスレッドで実行されているふりをして、実行して待機するだけです。この質問には、この問題に関する適切な議論が含まれています。. はい、これは .start() の代わりに .run() を呼び出すと便利な場合です。
java - threadExecutor からの戻り値
固定の threadExecutor 内で getOptimizedMol() メソッドにアクセスするにはどうすればよいですか? 各オプティマイザ スレッドが終了するたびに、戻り分子を取得する必要がありますか?
java - JavaのThreadPoolExecutorはカスタムThreadFactoryをどのように使用していますか?
ThreadPoolExecutor クラスを使用すると、カスタム ThreadFactory を指定して新しいスレッドを作成できます。ただし、Sun の ThreadPoolExecutor の実装内でこれらのスレッドがどのように使用されるかはわかりません。
この実装は、次のように新しいスレッドを作成します。
しかし、ワーカーの実装では、フィールド「スレッド」がランナーとしてどのように使用されているかわかりません。
さらに、再利用されるカスタムの「実行」メソッドをスレッドに提供する方法がわかりません(再利用される場合-ThreadPoolExecutorのように-「複数のRunnableを実行する」ことを意味します)。ThreadPoolExecutor がそのようなスレッドを再利用して複数の Runnable を実行するにはどうすればよいですか (クラス Thread の「ターゲット」Runnable が構築時に設定され、セッターがない場合)。ThreadPoolExecutor のドキュメントは次のとおりです。
これは、カスタム ThreadFactory によって作成されたスレッドの「run」メソッドが使用されないということですか? それが、「カスタムスレッドの作成 + スレッドの「再利用」」メカニズムを理解する唯一の方法です。
java - 2 つの ExecutorServices を待機する好ましい方法は?
2 つの ExecutorServices があります。1 つはプロデューサーを保持し、もう 1 つはコンシューマーを保持します。私は awaitTermination メソッドを使用していますが、これはブロックしており、タイムアウト パラメータが必要です。しかし、同じタイムアウトで両方の ExecutorServices を待ちたいと思います。awaitTermination 呼び出しがブロックされているため、次のことはできません。
最終的には、合計で 8 時間待機することになるからです。私は何をすべきか?
java - サーバーソケットクライアントの新しいスレッドの代わりにExecutorを使用する
私は現在、複数のクライアントが接続するサーバーを作成しています。通信プロトコルは、基本的にサーバーがクライアントにタスクを送信し、タスクが実行されたときにクライアントが応答するというものです。クライアントはサーバーへの接続を維持し、切断しないでください。
現在、各クライアントを処理するための新しいスレッドを開始しています。精神的には、私の現在のソリューションは次のようなものです:(実際にはJava同時実行からのソース)
しかし、エグゼキューターはより安定していて拡張性が高いように見えるので、エグゼキューターを使用したいと思います。したがって、サーバーがクライアントにメッセージを送信できるようにするには、クライアントを実行しているエグゼキューターとは別にクライアントを追跡する必要があります。したがって、クライアントをCopyOnWriteArrayListクライアントのどこに配置し、Serverクラスに次のようなものがある場合:
これにより、CopyOnWriteArrayListを反復処理して、すべてのクライアントにコマンドを送信し、切断されたクライアントを削除することができます。これは堅牢なソリューションでしょうか?何らかの理由でランナブルが例外を伝播した場合、エグゼキュータはどうなりますか?
java - 実際のJava並行性:BoundedExecutorの競合状態?
BoundedExecutor
『Java Concurrency in Practice』の実装には奇妙なことがあります。
エグゼキュータでキューに入れられているか実行されているスレッドが十分にある場合、送信スレッドをブロックすることにより、エグゼキュータへのタスク送信を抑制することになっています。
これは実装です(catch句に欠落している再スローを追加した後):
とを4の範囲でインスタンス化BoundedExecutor
するとExecutors.newCachedThreadPool()
、キャッシュされたスレッドプールによってインスタンス化されるスレッドの数が4を超えることはないと予想されますが、実際にはそうなります。私はこの小さなテストプログラムを入手して、最大11個のスレッドを作成しました。
セマフォのリリースとタスクの終了の間には、リリーススレッドがまだ終了していないときに別のスレッドが許可を取得してタスクを送信できる、ごくわずかな時間枠があると思います。つまり、競合状態があります。
誰かがこれを確認できますか?
java - Work/Task Stealing ThreadPoolExecutor
私のプロジェクトでは、クライアントから作業要求を受け取る Java 実行フレームワークを構築しています。作業 (さまざまなサイズ) は一連のタスクに分割され、処理のためにキューに入れられます。各タイプのタスクを処理する個別のキューがあり、各キューは ThreadPool に関連付けられています。ThreadPools は、エンジンの全体的なパフォーマンスが最適になるように構成されています。
この設計は、リクエストの負荷を効果的に分散するのに役立ち、大きなリクエストがシステム リソースを占有することはありません。ただし、一部のキューが空で、それぞれのスレッド プールがアイドル状態の場合、ソリューションが無効になることがあります。
これを改善するために、負荷の高いキューが他の ThreadPools から助けを得ることができるように、作業/タスクを盗む手法を実装することを考えていました。ただし、Java では複数のキューを ThreadPool に関連付けることができず、ワーク スティーリングの概念をサポートしていないため、独自の Executor を実装する必要がある場合があります。
Fork/Join について読んでください。しかし、それは私のニーズに合わないようです。このソリューションを構築するための提案や代替方法は非常に役立ちます。
ありがとうアンディ
java - Smalltalk - Smalltalk で Java プログラムを作成できますか?
コンパイラ用に作成したこの Java インタープリターを Smalltalk インタープリターに変換しようとしています。出来ますか?もしそうなら、何を見るのに良いリソースでしょうか? 私は Smalltalk にまったく慣れていないので、今のところ奇妙に見えます。助けていただければ幸いです、ありがとう。プログラムに関するその他の情報: 入力は中間コード ファイルで、そのサンプルは以下のとおりです。
数値の階乗を計算する中間コード ファイル:
JavaExecutor.java プログラム:
}
java - ScheduledExecutorService.shutdown()がCPUを100%使用するのはなぜですか?
私は次の簡単なコードを持っています:
実際、私の実際のコードはそれよりも少し複雑ですが、これらの行で問題を切り分けることができます。コードは基本的に実行可能ファイルを実行するために10秒間待機してから、メインプログラムの終了を通知します。
しかし、10秒間気づいたのですが、私のコアの1つが100%使用されています。
この行にコメントすると:
CPUコアも100%で使用され、メインプログラムもRunnableの前に終了します。
この行にコメントすると:
CPUは適切に使用されていますが、プログラムは終了しません。
前の行の両方にコメントすると、CPUは適切に使用されますが、メインプログラムは終了しません。
- 私のコードに何か問題がありますか?
executor.shutdown();
新しいタスクの送信を無効にするだけでなく、ある種のビジーウェイトを実行していますか?- または、JVMのせいにする必要がありますか?
追加の詳細:
PS:お願いします、私にCountDownLatch
norを使うように頼まないでくださいnewSingleThreadScheduledExecutor
。それは私が尋ねている質問とは関係ありません。ありがとう。
編集:
これがJavaダンプです:
java - 異なる一意のIDを使用した各スレッドのパフォーマンスの向上
問題の説明は次のとおりです。-
各スレッドは1から1000までの一意のIDを使用し、プログラムは60分以上実行する必要があるため、その60分ですべてのIDが終了する可能性があるため、それらのIDを再利用する必要があります。
私はそれを行ういくつかの方法を知っています、1つの方法はStackOverflowの助けを借りて書いた以下の方法ですが、これを実行しようとすると、数分の実行後にこのプログラムが非常に遅くなり、多くの時間がかかることがわかりましたコンソールにIDを印刷する時間。また、OutOfMemoryエラーが発生することもあります。この種の問題を解決するためのより良い方法はありますか?