Java多线程面试题:构造方法与静态块调用线程

Java Q&A Hub 使用 GPT-4o-mini 回答

问题:

Java面试题之多线程 线程类的构造方法、静态块是被哪个线程调用的?

回答:

在Java中,线程类的构造方法和静态块是由创建该线程的线程调用的。

具体来说:

  1. 构造方法:当你创建一个线程对象时,构造方法是在当前线程中执行的。例如,如果你在主线程中创建一个新的线程对象,那么该线程对象的构造方法就是在主线程中被调用的。

    public class MyThread extends Thread {
        public MyThread() {
            System.out.println("构造方法被调用,当前线程:" + Thread.currentThread().getName());
        }
    
        public void run() {
            System.out.println("run方法被调用,当前线程:" + Thread.currentThread().getName());
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            MyThread myThread = new MyThread(); // 在主线程中调用构造方法
            myThread.start(); // 启动新线程
        }
    }
    

    在上面的代码中,构造方法的输出会显示当前线程是主线程,而 run 方法的输出会显示是新线程。

  2. 静态块:静态块是在类被加载时执行的,类的加载是由加载该类的线程完成的。因此,静态块也是由创建该类的线程调用的。

    public class MyThread extends Thread {
        static {
            System.out.println("静态块被调用,当前线程:" + Thread.currentThread().getName());
        }
    
        public void run() {
            System.out.println("run方法被调用,当前线程:" + Thread.currentThread().getName());
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            MyThread myThread = new MyThread(); // 在主线程中调用构造方法
            myThread.start(); // 启动新线程
        }
    }
    

    在这个例子中,静态块的输出会显示当前线程是主线程,因为类 MyThread 是在主线程中被加载的。

总结:构造方法和静态块都是由创建线程的线程(通常是主线程)调用的。