いくつかのスレッドで実行されるプログラムがあります。メイン スレッドは他のスレッドとオブジェクトを共有し、メインでは次の呼び出しを行います。
synchronized(obj){
do stuff
}
メインスレッドが枯渇していて、にアクセスできない疑いがありますobj
。メインスレッドの優先度を上げるにはどうすればよいですか、それともデフォルトで他のスレッドよりもすでに高いですか?
いくつかのスレッドで実行されるプログラムがあります。メイン スレッドは他のスレッドとオブジェクトを共有し、メインでは次の呼び出しを行います。
synchronized(obj){
do stuff
}
メインスレッドが枯渇していて、にアクセスできない疑いがありますobj
。メインスレッドの優先度を上げるにはどうすればよいですか、それともデフォルトで他のスレッドよりもすでに高いですか?
ここにある一連の記事は、さまざまなプラットフォームでのスレッドの優先順位の管理が複雑であることを示しています。
あなたの根本的な問題は、ワーカー スレッドが非常に CPU を集中的に使用するため、プロセッサを自然に「手放す」ポイントに到達することはめったにないということではないでしょうか (たとえば、IO を実行したり、スリープしたりします)。これらのワーカーに yield() への呼び出しをいくつか含めると、他のスレッドにより多くのチャンスが与えられます。
Macarseが言う方法でメイン スレッドの優先順位を上げる
と、おそらくうまくいくでしょう。ただし、プラットフォームのプリエンプティブ スレッド スケジューラが正しく機能することに依存しています。Thread.yield()
代わりに、ワーカー スレッドで実行中のコードの重要なセクションが完了したら、静的メソッドを呼び出す必要があります。これは、異なるレベルのスレッド優先度を使用している場合でも、身に付けるのに適した習慣です。
他の人がすでに答えたように、実際には次のようにスレッドに優先度を設定できます。
Thread.currentThread().setPriority(priority);
ただし、あなたの例では、スレッドの優先順位は、スレッドが同期されたオブジェクトにアクセスする順序とは関係がないことに注意してください。Java は他の基準を使用してアクセスを許可します。たとえば、これを参照してください。