LoginSignup
2
4

More than 5 years have passed since last update.

android.os.Processが定義するスレッド優先度とjava.lang.Threadが定義するスレッド優先度の関係

Last updated at Posted at 2017-04-17

スレッド優先度の2つの系統

Androidでは、スレッドの優先度に関して2つの系統があります。

  • java.lang.Thread
    • Java標準のAPIで使われる (Thread, ThreadFactory など)
    • 最小値 1 (MIN_PRIORITY) 〜 最大値 10 (MAX_PRIORITY)
    • 値が大きい方が優先される
  • android.os.Process
    • Java標準でないAndroid APIで使われる (android.os.Process など)
    • 最小値 -20 〜 最大値 19
    • 値が小さいほうが優先される
    • いわゆるUnix/Linuxにおける nice値

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_AUDIOProcess.THREAD_PRIORITY_URGENT_AUDIO はJava標準のAPIでは設定できません。普通のアプリではあまり必要性はないと思いますが、もし、そういった優先度を設定したい場合は、Android APIである android.os.Process.setThreadPriority(int) などを使う必要があります。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4