【问题标题】:Java threads behaving differnetly [duplicate]Java线程表现不同[重复]
【发布时间】:2016-05-27 05:20:27
【问题描述】:

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

根据我的理解,程序肯定打印出来是真的吗?

但是如果你运行程序,你会发现它什么也没打印;它只是挂起。

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);
}

}

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

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    “类的静态初始化程序在第一次访问该类时运行,以创建实例或访问静态方法或字段。” Static Initialization Blocks

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

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

    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);
        }
    }
    

    【讨论】:

    • 好像死锁了
    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2016-05-22
    • 2014-08-31
    相关资源
    最近更新 更多