スレッドの実行権の放棄

Revised: Mar./23rd/2002

sleep() は、指定した一定の時間スレッドをスリープさせた後、実行可能状態に戻します。yield() は、実行中のスレッドの実行権を一時的に放棄して、実行可能状態に戻します。その結果、実行可能状態にあるスレッドが他にあればそのスレッドが実行され、放棄したスレッドはそのスレッドが終了するまで実行可能状態のまま待機するかもしれません。

public static void yield()

このメソッドも sleep() と同じく static 宣言されたクラスメソッドなので、 Thread クラスのメソッドとして呼び出します。

YieldTest.java:

class YieldingA implements Runnable {
	public void run() {
		System.out.println("YieldingA Start");
		Thread.yield();	// 実行権の一時放棄
		System.out.println("YieldingA End");
	}
}

class YieldingB implements Runnable {
	public void run() {
		System.out.println("\t" + "YieldingB Start");
		System.out.println("\t" + "YieldingB End");
	}
}

class YieldTest {
	public static void main(String[] args) {
		System.out.println("main Start");

		// 実行可能クラスのインスタンス化
		YieldingA runA = new YieldingA();
		YieldingB runB = new YieldingB();
		// スレッドへ委譲
		Thread threA = new Thread(runA);
		Thread threB = new Thread(runB);
		// スレッドの開始
		threA.start();
		threB.start();

		Thread.yield();	// 実行権の一時放棄
		System.out.println("main End");
	}
}

sleep() の代わりに yield() を呼び出して実行中のスレッドを一時的に実行可能状態に戻しています。

C:\Java\Thread>javac YieldTest.java

C:\Java\Thread>java YieldTest
main Start
YieldingA Start
        YieldingB Start
        YieldingB End
main End
YieldingA End

C:\Java\Thread>

ここでは、実行中のスレッドが実行権を放棄した結果、次のスレッドが実行されています。プライオリティ(優先度)によっては、放棄しても実行権が譲られないでそのまま実行されつづける場合もあるのですが、このサンプルでは順次実行権が譲られています。但し、 YieldingB スレッドが実行終了した後は YieldingA ではなく、 main() が実行されています。



Copyright © 2002 SUGAI, Manabu. All Rights Reserved.