1.スレッドスケジューラの役割
スレッド スケジューラは、どのスレッドをどのくらいの時間実行できるかを決定します。 スケーリング ポリシーはオペレーティング システムによって異なります。 移植性が損なわれるため、プログラムの正確性やパフォーマンスを保証するためにスケジューラの動作に依存しないことが重要です。
2.堅牢なプログラムのための戦略: スレッドバランシング
堅牢なプログラムを作成するには、実行可能なスレッドの数を使用可能なプロセッサの数に近づけてください。これにより、スケジューラの過負荷が回避され、一貫した動作が保証されます。 スレッドの総数はもっと多くなる可能性がありますが、待機中の (実行不可能な) スレッドはシステム負荷に大きな影響を与えません。
3.スレッド管理のテクニック: アクティブな待機とスケーリングの回避
スレッドが共有リソースの状態を常にチェックするホット ウェイティングを避けてください。 これにより、プロセッサのリソースが不必要に消費されます。 (Executor Framework と同様に) スレッド プールのサイズを正しく設定し、適切なサイズのタスクを作成することによって、実行可能なスレッドの数を減らします。オーバーヘッドが発生するほど小さすぎたり、並列処理が妨げられるほど大きすぎたりしないでください。
4.悪い習慣の例: 積極的な希望
以下のコードは、アクティブ待機を示しています。
<code class="language-java">public class SlowCountDownLatch { private int count; public SlowCountDownLatch(int count) { this.count = count; } public void await() { while (count > 0) { // Espera-ativa: desperdício de recursos do processador } } public void countDown() { if (count > 0) { count--; } } }</code>
このコードは過剰なリソースを消費します。 解決策は、効率的なブロックメカニズムを使用する CountDownLatch
を使用することです。
5. Thread.yield()
Thread.yield()
メソッドは、異なる JVM 実装間で一貫性がなく、同時実行性の問題に対する堅牢または移植可能なソリューションを提供しません。 Thread.yield()
を使用する代わりに、コードを再構築して実行可能なスレッドの数を減らします。
間違った例:
<code class="language-java">while (!condition) { Thread.yield(); // Incorreto: uso de Thread.yield() }</code>
6.スレッド優先度の調整
スレッドの優先順位の調整も移植性が低く、オペレーティング システムと JVM によって異なります。 その使用は、サービス品質の向上により移植性の喪失が正当化される特定のシナリオに限定される必要があり、構造的な問題の解決策としては決して使用しないでください。
7.結論
プログラムのパフォーマンスを修正または最適化するためにスケジューラに依存しないでください。 Thread.yield()
の使用や過度の優先度調整は避けてください。 最善のアプローチは、実行可能なスレッドのバランスのとれた数を維持するようにアプリケーションを再構築することです。
本の例:
以上が項目 スレッドスケジューラに依存しないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。