Revised: Mar./23rd/2002
スレッドは優先度や開始順序に基づいて、スケジューラによって実行順序がスケジューリングされます。優先度を明示的に上げたり下げたりすることで、スレッドの実行順序を変化させることができます。
public final void setPriority(int newPriority) public final int getPriority()
優先度を設定/取得するこれらのメソッドは、 sleep()
/yield()
とは異なり、 static
宣言されていない普通のインスタンス・メソッドです。したがって、インスタンス化したオブジェクト固有のメソッドとして呼び出します。
ここで設定できる優先度は 1 から 10 までの整数値で、数字が大きい方が優先して実行されます。また、定数として次のものが定義されています:
MIN_PRIORITY
public static final int MIN_PRIORITY
NORM_PRIORITY
public static final int NORM_PRIORITY
MAX_PRIORITY
public static final int MAX_PRIORITY
これらの定数は static
宣言されているクラス変数なので、利用する場合は Thread
クラス型のフィールドとしてアクセスします。勿論、参照元のクラスが Thread
クラスを継承したサブクラスの場合は、接頭辞をつけなくても直接利用できます。
// 実行可能クラス型オブジェクトのスレッド化 Thread pri = new Thread(runnableObj); // スレッドオブジェクトのメソッド呼び出し int i = pri.getPriority(); pri.setPriority(3); pri.setPriority(Thread.MAX_PRIORITY);
PriorityTest.java
:
class PrioritizingA implements Runnable { public void run() { System.out.println("PrioritizingA Start"); System.out.println("PrioritizingA End"); } } class PrioritizingB implements Runnable { public void run() { System.out.println("\t" + "PrioritizingB Start"); System.out.println("\t" + "PrioritizingB End"); } } class PriorityTest extends Thread { public static void main(String[] args) { PriorityTest main = new PriorityTest(); main.start(); } public void run() { System.out.println("main Start"); // 実行可能クラスのインスタンス化 PrioritizingA runA = new PrioritizingA(); PrioritizingB runB = new PrioritizingB(); // スレッドへ委譲 Thread threA = new Thread(runA); Thread threB = new Thread(runB); System.out.println(""); // 優先度の出力 System.out.println("デフォルトの優先度"); System.out.println(" main: " + this.getPriority()); System.out.println("threA: " + threA.getPriority()); System.out.println("threB: " + threB.getPriority()); System.out.println(""); // 優先度のセット this.setPriority(Thread.MIN_PRIORITY); threA.setPriority(Thread.NORM_PRIORITY); threB.setPriority(Thread.MAX_PRIORITY); // 優先度の出力 System.out.println("明示的にセットした優先度"); System.out.println(" main: " + this.getPriority()); System.out.println("threA: " + threA.getPriority()); System.out.println("threB: " + threB.getPriority()); System.out.println(""); // スレッドの開始 System.out.println("threA 実行可能状態"); threA.start(); System.out.println("threB 実行可能状態"); threB.start(); System.out.println("main End"); } }
ここでは、インスタンスメソッドである getPriotiry()
/setPriority()
を用いる為に、 main()
メソッドのクラスを Thread
の継承として作り、自分自身をインスタンス化しています。
C:\Java\Thread>javac PriorityTest.java C:\Java\Thread>java PriorityTest main Start デフォルトの優先度 main: 5 threA: 5 threB: 5 明示的にセットした優先度 main: 1 threA: 5 threB: 10 threA 実行可能状態 PrioritizingA Start PrioritizingA End threB 実行可能状態 PrioritizingB Start PrioritizingB End main End C:\Java\Thread>
優先度を設定した割には、あまり劇的な変化はありません。優先度の値がスケジューリングに与える影響は、プラットフォームに一任されており、言語仕様としては決まっていません。
それでも、次の情報は押さえておいた方が良いでしょう:
int
型)の優先度を持つNORM_PRIORITY
) であるMAX_PRIORITY
) 、最低値は1 (MIN_PRIORITY
) であるgetPriority()
/setPriority()