スレッド優先度の2つの系統
Androidでは、スレッドの優先度に関して2つの系統があります。
-
java.lang.Thread
系- Java標準のAPIで使われる (
Thread
,ThreadFactory
など) - 最小値 1 (
MIN_PRIORITY
) 〜 最大値 10 (MAX_PRIORITY
) - 値が大きい方が優先される
- Java標準のAPIで使われる (
-
android.os.Process
系- Java標準でないAndroid APIで使われる (
android.os.Process
など) - 最小値 -20 〜 最大値 19
- 値が小さいほうが優先される
- いわゆるUnix/Linuxにおける nice値
- Java標準でないAndroid APIで使われる (
AndroidはLinuxがベースのOSなので、内部的には後者のnice系でスレッドの優先度が管理されています。
2つのスレッド優先度系の間のマッピング
つまり、Java系で定義されるスレッド優先度は、どこかでnice系のスレッド優先度に変換されます。アプリのランタイムにARTが使われている近年のAndroidの場合、ARTの実装に変換テーブルが埋め込まれており、それを見ると、Java系のスレッド優先度がどのnice値に変換されるかがわかります。
static const int kNiceValues[10] = {
ANDROID_PRIORITY_LOWEST, // 1 (MIN_PRIORITY)
ANDROID_PRIORITY_BACKGROUND + 6,
ANDROID_PRIORITY_BACKGROUND + 3,
ANDROID_PRIORITY_BACKGROUND,
ANDROID_PRIORITY_NORMAL, // 5 (NORM_PRIORITY)
ANDROID_PRIORITY_NORMAL - 2,
ANDROID_PRIORITY_NORMAL - 4,
ANDROID_PRIORITY_URGENT_DISPLAY + 3,
ANDROID_PRIORITY_URGENT_DISPLAY + 2,
ANDROID_PRIORITY_URGENT_DISPLAY // 10 (MAX_PRIORITY)
};
上記の配列は、Java系 Thread.MIN_PRIORITY
がnice系 ANDROID_PRIORITY_LOWEST
に、Java系 Thread.MAX_PRIORITY
がnice系 ANDROID_PRIORITY_URGENT_DISPLAY
にマッピングされることを表しています。
Thread.MAX_PRIORITY
にマッピングされている ANDROID_PRIORITY_URGENT_DISPLAY
は -8 なので、それよりも優先度が高い Process.THREAD_PRIORITY_AUDIO
や Process.THREAD_PRIORITY_URGENT_AUDIO
はJava標準のAPIでは設定できません。普通のアプリではあまり必要性はないと思いますが、もし、そういった優先度を設定したい場合は、Android APIである android.os.Process.setThreadPriority(int)
などを使う必要があります。