Javaのスレッドに優先度を設定する
-
06-07-2019 - |
質問
いくつかのスレッドで実行するプログラムがあります。メインスレッドは他のスレッドとオブジェクトを共有し、メインでは次の呼び出しを行います。
synchronized(obj){
do stuff
}
メインスレッドが不足していて、 obj
にアクセスできないという疑いがあります。メインスレッドの優先度を上げるにはどうすればよいですか、またはデフォルトで他のスレッドよりもすでに高いですか?
解決
ThreadクラスにsetPriority()メソッドがあります。
このjavadoc を確認します。
スレッドの優先度を最大に設定:
public static void main(String args[]) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
// Your main code.
}
他のヒント
一連の記事こちらは、スレッドの優先順位の管理における複雑さを示しています。さまざまなプラットフォームで。
基本的な問題は、ワーカースレッドが非常にCPUを集中的に使用しているために、自然に「放す」ようになることはめったにないのかどうかです。プロセッサの(たとえば、IOを実行したり、スリープさせたりします。)そのような場合は、それらのワーカーにyield()の呼び出しを含めることで、他のスレッドにより多くのチャンスを与えることができます。
setPriority()メソッドを使用できます。例:
new MyThread("Foo").start();
Thread bar = new MyThread("Bar");
bar.setPriority( Thread.NORM_PRIORITY + 1 );
bar.start();
これにより、barにFooをすぐに引き継ぐ新しい優先度が与えられます
編集:
コメントに回答するには、次を使用して最大優先順位を設定できます。
bar.setPriority( Thread.MAX_PRIORITY );
メインスレッドの優先度を上げる
Macarse はおそらく動作すると言います。ただし、プラットフォームのプリエンプティブスレッドスケジューラに依存して適切に動作します。代わりに、実行中のコードの重要なセクションが終了したら、ワーカースレッドで Thread.yield()
静的メソッドを呼び出す必要があります。これは、さまざまなレベルのスレッド優先度を使用している場合でも取得するのに適した習慣です。
他の人がすでに答えているように、実際には次のようにスレッドに優先度を設定できます:
Thread.currentThread().setPriority(priority);
しかし、あなたの例では、スレッドの優先順位は、スレッドが同期オブジェクトにアクセスする順序とは関係がないことに注意してください。 Javaは他の基準を使用してアクセスを許可します。 たとえば、これを参照してください。