next up previous
Next: 16.7 ブロックの原因 Up: 16 スレッドのスケジューリング Previous: 16.5 自発的な再スケジューリング sleep,yieldメソッド

16.6 スレッドの終了待ち joinメソッド

joinメソッドを用いると,他のスレッドの終了を待つことができるようになる. 以下のように,CalcThreadを開始した後,しばらく何か他のことを行い,それか らそのスレッドをjoinする.joinが戻ってきた時には,CalcThread.runが終了 していることが保証され,resultには値が設定される.doSomethingElse が完了した時点で,すでにCalcThreadが終了していれば,joinはすぐ戻る.

class CalcThread extends Thread {
    private double result;
    public void run() {
        result = calculate();
    }
    public double getResult() {
        return result;
    }
    public double calculate() {
        // ... result の値を計算する.
    }
}
class ShowJoin {
    public static void main(String[] args) {
        CalcThread calc = new CalcThread();
        calc.start();
        doSomethingElse();
        try {
            calc.join();
            System.out.println("result is "
               + calc.getResult());
        } catch (InterruptedException e) {
            System.out.println("No answer: interrupted");
        }

    // ... doSomethingElse()の定義        

    }
joinは,isAlive()によって定義され,

while (isAlive()) wait();
のように書かれていて,スレッドが終了する際に,ランタイムシステムが notifyAllを呼び出すというように振る舞っていると考えられる.

generated through LaTeX2HTML. M.Inaba 平成18年5月7日