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 回答