0

Javaスレッドで奇妙な動作を見つけました。コード例は次のとおりです。

class Job extends Thread {
    private Integer number = 0;
    public void run() {
        for (int i = 1; i < 1000000; i++) {
            number++;
        }
    }
    public Integer getNumber() {
        return number;
    }
}
public class Test {
    public static void main(String[] args)
            throws InterruptedException {
        Job thread = new Job();
        thread.start();
        synchronized (thread) {
            thread.wait();
        }
        System.out.println(thread.getNumber());
    }
}

予期せず、999999が出力されます。start () メソッドロジックの最後にnotify()呼び出しがあるようです。何か案は?

4

1 に答える 1

3

start()メソッドロジックの最後にnotify()呼び出しがあるようです。

ええそれはそうです。スレッドが終了すると、notify()それがどのように機能するかを実行Thread.join()します。以下のJava1.6コードのサンプルを次に示しますThread.join()

public final synchronized void join(long millis) throws InterruptedException {
    long base = System.currentTimeMillis();
    long now = 0;
    if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
    }
    if (millis == 0) {
        while (isAlive()) {
            wait(0);
        }
    } else {
            ...

とはいえ、これは実装に依存する可能性があるため、信頼すべきではありません。

于 2013-01-29T20:53:03.460 に答える