Java 线程表现不同

标签 java multithreading

<分区>

这个类没有以通常的方式初始化自己,所以它在后台线程的帮助下调用。

根据我的理解,程序肯定必须打印 true 吗?

但是如果你运行这个程序,你会发现它没有打印任何东西;它只是挂起。

public class Test {
 private static boolean isInitialized = false;
  static {
    Thread t = new Thread(new Runnable() {
        public void run() {
            isInitialized = true;
        }
    });
    t.start();
    try {
        t.join();
    } catch (InterruptedException e) {
    }
}

public static void main(String[] args) {
    System.out.println(isInitialized);
}

谁能解释一下为什么会这样。

最佳答案

“类的静态初始值设定项在首次访问类时运行,要么创建实例,要么访问静态方法或字段。” Static Initialization Blocks

我猜这个程序要启动需要先初始化类Test。因此它首先尝试执行静态 block ,但该 block 永远不会退出(因为它无法设置静态成员 isInitialized,因为它尚未准备好)。 所以测试类从未完全初始化,因此 main 方法甚至没有开始执行。

您的解决方案可能是将等待初始化线程完成的指令移至 main 方法。所以它不会阻止测试类被完全初始化。

package com.company;

public class Test {
    private static boolean isInitialized = false;

    static Thread t = new Thread(new Runnable() {
        public void run() {
            isInitialized = true;
        }
    });
    static {
        t.start();
    }

    public static void main(String[] args) {
        try {
            t.join();
        } catch (InterruptedException ignored) { }

        System.out.println(isInitialized);
    }
}

关于Java 线程表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37475397/

相关文章:

c# - 并行.For "Thread local state"

c++ - 在包装类 scoped_threads 中运行的线程没有输出

java - 在java中使用多线程调用同一类的不同方法

java - spring boot中为静态资源设置setCachePeriod

java - 以编程方式将按钮添加到 fragment

java - 如何使用作业对象数组? (Jni)

java - Eclipse 项目是否编译?

java - android通知横幅不显示

c++ - Builder 6 中的线程

c# - 如果我使用 Parallel.ForEach(),为什么会丢失某些文件?