似乎Thread.start()执行notify()

时间:2013-01-29 20:51:31

标签: java multithreading monitor

我刚刚在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()调用。 有什么想法吗?

1 个答案:

答案 0 :(得分:3)

  

似乎在start()方法逻辑结束时有notify()调用。

是的,这是真的。线程完成后会执行notify(),这就是Thread.join()的工作方式。以下是Thread.join()的Java1.6代码示例:

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 {
            ...

也就是说,这可能取决于实现,不应该依赖。