java - 看来Thread.start()做了一个notify()

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

最佳答案

Seems like there is notify() call at the end of start() method logic.

是的,这是真的。当线程完成时,它会执行一个 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 {
            ...

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

关于java - 看来Thread.start()做了一个notify(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14592008/

相关文章:

java - 按需实例化 Spring beans,而不是在启动时实例化

java - HTTP 状态 404 - 在创建 Spring Boot 应用程序时未找到

java - 在 Java 中从字节转换为 int

c# - 如何等待任务执行结束来恢复程序的执行

c++ - 使用线程的 vector 和没有加速

JAVA - 计算器没有 if's 或 catch - ScriptEngineManager

java - Java中synchronized语句的静态锁对象

java - Java 中存储的对象的条目数在哪里

ruby-on-rails - 有没有像 cacti 一样使用 Rails 的开源项目?

c++ - 尝试打开显示设备句柄以使用 C++ 在 Windows XP 上更改亮度