問題タブ [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: 作成するタイマーとスレッド
この質問があります:
私はタイマーを持っています。scheduleAtFixedRate を使用すると、新しいタイマー タスクが作成されます。そのタイマー タスクには、完了するまでに時間がかかる特定のコードがあります。前のタスクがまだ完了していないときにタイマーが新しいタスクを作成しないようにするにはどうすればよいですか?
ありがとう
java - Java: SingleThreadScheduledExecutor & java.util.concurrent.RejectedExecutionException
私はこの問題を抱えています、私は持っています
および 50 ミリ秒ごとに作成されるタスク:
myTask
完了するまでに時間がかかる場合があります (2 ~ 3 秒程度) が、newSingleThreadScheduledExecutor は、次にスケジュールされた myTask が現在のタスクが完了するまで待機することを保証します。
ただし、時々このエラーが発生します。
実行する:java.util.concurrent.RejectedExecutionException
私は何をすべきか?ありがとう
java - 飽和している場合、ThreadPoolExecutor の submit() メソッドをブロックする方法は?
ThreadPoolExecutor
最大サイズに達してキューがいっぱいになると、新しいタスクを追加しようとするとsubmit()
メソッドがブロックされるようなものを作成したいと考えています。そのためのカスタムを実装する必要RejectedExecutionHandler
がありますか、それとも標準 Java ライブラリを使用してこれを行う既存の方法はありますか?
java - 永久に実行する必要があるタスクのJavaExecutorのベストプラクティス
複数のタスクを非同期で実行する必要があるJavaプロジェクトに取り組んでいます。私はExecutorがこれを行うための最良の方法であると信じるように導かれているので、私はそれに精通しています。(学ぶために報酬を得ることができます!)しかし、私がやろうとしていることを達成するための最善の方法が何であるかは私にはわかりません。
議論のために、2つのタスクを実行しているとしましょう。どちらも終了することは期待されておらず、アプリケーションの存続期間中は両方を実行する必要があります。次のようなメインラッパークラスを作成しようとしています。
- いずれかのタスクが例外をスローした場合、ラッパーはそれをキャッチしてタスクを再開します。
- いずれかのタスクが完了するまで実行されると、ラッパーはタスクに気づき、再起動します。
ここで、両方のタスクの実装はrun()
、ループを中断することなくすべての実行時例外を処理する必要があるtry / catchブロックを使用して、完全に実行されることのない無限ループにコードをラップすることに注意してください。私は確実性の別の層を追加しようとしています。私または私をフォローしている誰かが、これらのセーフガードを無効にしてタスクを停止するような愚かなことをした場合、アプリケーションは適切に反応する必要があります。
私よりも経験豊富な人々が推奨するこの問題に取り組むためのベストプラクティスはありますか?
FWIW、私はこのテストクラスを作成しました:
それは私が望むように振る舞っていますが、私を驚かせるのを待っている落とし穴、非効率性、またはまったく間違った方向性があるかどうかはわかりません。(実際、私はこれに慣れていないので、何か間違っている/望ましくないことがなければ、私はショックを受けるでしょう。)
どんな洞察も歓迎します。
java - ExecutorServicesへのキュー長インジケーターのエレガントな実装
なぜ、ああ、なぜそのsのjava.util.concurrent
キュー長インジケーターを提供しないのですか?ExecutorService
最近、私は自分が次のようなことをしていることに気づきました。
これは問題なく動作しますが...これは実際にはの一部として実装する必要があると思いますExecutorService
。実際のキューから分離されたカウンターを持ち歩くのはばかげてエラーが発生しやすく、その長さはカウンターが示すことになっています(C配列を思い出させます)。ただし、ExecutorService
sは静的ファクトリメソッドを介して取得されるため、他の点では優れたシングルスレッドエグゼキュータを単純に拡張してキューカウンタを追加する方法はありません。だから私は何をすべきか:
- JDKにすでに実装されているものを再発明しますか?
- 他の賢い解決策?
java - これには明示的な同期が必要ですか?
2 つのスレッドがあり、LinkedBlockingQueue で同期を正しく実行していることを確認したい..これは正しいですか? または、(messageToCommsQueue) での明示的な同期は必要ありませんか?
宣言:
方法 1:
方法 2:
java - Java Executors: タスクの優先度を設定するにはどうすればよいですか?
Executor によって実行されるタスクに優先順位を設定する可能性はありますか? JCIPでそれが可能であるという声明をいくつか見つけましたが、例が見つからず、ドキュメントに関連するものも見つかりません。
JCIP より:
実行ポリシーは、次のようなタスク実行の「何を、どこで、いつ、どのように」を指定します。
- ...
- タスクはどのような順序で実行する必要がありますか (FIFO、LIFO、優先順位)?
- ...
UPD : 聞きたいことを正確に聞いていないことに気付きました。私が本当に欲しかったのは:
エグゼキューターフレームワークでスレッドの優先順位の設定を使用/エミュレートする方法(つまり、何だったのかthread.setPriority()
)?
java - ScheduledExecutorServiceのライフサイクル?
オブジェクト自体が生きている間に定期的に作業を行う必要があるオブジェクトがあるので、次のように設計しました。基本的に、ScheduledExecutorServiceインスタンスへの参照を含むMainクラス。この例では、すべての定期的な作業は、文字列をstdに出力することです。
コードは次のように動作することを期待しています。
- test2が呼び出され、メインオブジェクトo1(その中にScheduledExecutorService)が作成されます。
- test2レジスタを使用して、o1に毎秒1行を出力します。
- test2が戻り、o1がガベージになります。
- システムgcはgco1を起動します。これには、ローカルスケジューラをシャットダウンするfinalizeメソッドがあります。
しかし、私がこのプログラムを実行すると、何が起こるかというと、それは永遠に続くということです。基本的に、gcがo1のファイナライザーを呼び出すことはなく、その結果、スケジューラーがシャットダウンすることはなく、その結果、メインスレッドが終了しても、プログラムは終了しません。
ここで、test2()でo1.registerをコメントアウトすると、プログラムは正常に動作します。たとえば、gcが呼び出されます。また、デバッガーでは、ScheduledExecutorService.scheduleを呼び出した後にのみ実際のスレッドが作成されます。
何が起こっているのか説明はありますか?
}
java - ThreadPoolExecutor ポリシー
ThreadPoolExecutor を使用してタスクをスケジュールしようとしていますが、そのポリシーで問題が発生しています。その動作は次のとおりです。
- 実行中のスレッドが corePoolSize よりも少ない場合、Executor は常に、キューに入れるよりも新しいスレッドを追加することを優先します。
- corePoolSize 以上のスレッドが実行されている場合、Executor は常に、新しいスレッドを追加するよりも要求をキューに入れることを優先します。
- 要求をキューに入れることができない場合、これが maximumPoolSize を超えない限り、新しいスレッドが作成されます。この場合、タスクは拒否されます。
私が望む動作はこれです:
- 同上
- corePoolSize より多いが maximumPoolSize より少ないスレッドが実行されている場合、キューイングよりも新しいスレッドの追加を優先し、新しいスレッドの追加よりもアイドル スレッドの使用を優先します。
- 同上
基本的に、どのタスクも拒否されたくありません。それらを無制限のキューに入れたい。しかし、私は maximumPoolSize スレッドまで持ちたいと思っています。無制限のキューを使用すると、coreSize に達するとスレッドが生成されません。バインドされたキューを使用すると、タスクが拒否されます。これを回避する方法はありますか?
私が今考えているのは、SynchronousQueue で ThreadPoolExecutor を実行することですが、タスクを直接フィードするのではなく、別の無制限の LinkedBlockingQueue にフィードすることです。次に、別のスレッドが LinkedBlockingQueue から Executor にフィードし、拒否された場合は、拒否されなくなるまで再試行します。これは面倒でちょっとしたハックのように思えますが、これを行うためのよりクリーンな方法はありますか?
java - キューがいっぱいになると ThreadPoolExecutor がブロックされますか?
ThreadPoolExecutor を使用して多くのタスクを実行しようとしています。以下は架空の例です。
java.util.concurrent.RejectedExecutionException
問題は、タスクの数が作業キューのサイズを超えているため、すぐに取得できることです。ただし、私が探している望ましい動作は、キューに空きができるまでメイン スレッドをブロックすることです。これを達成するための最良の方法は何ですか?