web-dev-qa-db-ja.com

Javaのスレッドに優先度を設定する

いくつかのスレッドで実行されるプログラムがあります。メインスレッドは他のスレッドとオブジェクトを共有し、メインでは次の呼び出しがあります。

synchronized(obj){
    do stuff
}

メインスレッドが不足しており、objへのアクセス権を取得していないのではないかと疑っています。メインスレッドの優先度を上げるにはどうすればよいですか、またはデフォルトで他のスレッドよりもすでに高いですか?

27
Guy

ThreadクラスにsetPriority()メソッドがあります。

このjavadoc を確認してください。

スレッドの優先度を最大に設定:

public static void main(String args[]) {
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    // Your main code.
}
44
Macarse

一連の記事 here は、さまざまなプラットフォームでのスレッドの優先順位の管理における複雑さを示しています。

あなたの基本的な問題は、単にあなたのワーカースレッドが非常にCPUに集中しているため、プロセッサを自然に「手放す」ポイントに達することはほとんどないのだろうか(例えば、IOまたはそのような場合は、それらのワーカーにyield()の呼び出しを含めて、他のスレッドにより多くのチャンスを与えることができます。

9
djna

setPriority()メソッドを使用できます。例えば:

new MyThread("Foo").start(); 
Thread bar = new MyThread("Bar"); 
bar.setPriority( Thread.NORM_PRIORITY + 1 ); 
bar.start();

これにより、Fooをすぐに引き継ぐ新しい優先順位がbarに与えられます

編集:

コメントに回答するには、次を使用して最大優先順位を設定できます。

bar.setPriority( Thread.MAX_PRIORITY );
5
northpole

Macarseが言うように、メインスレッドの優先度を上げるとおそらく動作します。ただし、プラットフォームのプリエンプティブスレッドスケジューラが適切に機能していることに依存しています。代わりに、実行中のコードの重要なセクションが終了したら、ワーカースレッドでThread.yield()静的メソッドを呼び出す必要があります。これは、さまざまなレベルのスレッド優先度を使用している場合でも入る良い習慣です。

3
Lorek

他の人がすでに答えているように、実際には次のようにスレッドに優先順位を設定できます。

Thread.currentThread().setPriority(priority);

しかし、あなたの例では、スレッドの優先順位は、スレッドが同期オブジェクトにアクセスする順序とは関係がないことに注意してください。 Javaは他の基準を使用してアクセスを許可します。たとえば、 this を参照してください。

1
Sigi