スレッドの優先度の設定

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
値は1。スレッドに設定できる最低優先順位です。
NORM_PRIORITY
public static final int NORM_PRIORITY
値は5.スレッドに割り当てられるデフォルトの優先順位です。
MAX_PRIORITY
public static final int MAX_PRIORITY
値は10.スレッドに設定できる最高優先順位です。

これらの定数は 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>

優先度を設定した割には、あまり劇的な変化はありません。優先度の値がスケジューリングに与える影響は、プラットフォームに一任されており、言語仕様としては決まっていません。

それでも、次の情報は押さえておいた方が良いでしょう:



Copyright © 2002 SUGAI, Manabu. All Rights Reserved.