Java 线程初学者:什么';在子类';s(扩展线程类)构造函数?

Java 线程初学者:什么';在子类';s(扩展线程类)构造函数?,java,multithreading,Java,Multithreading,super()用于从子类的构造函数中执行超类的构造函数。在这个程序中,无论构造函数中是否包含super(),输出都保持不变。那么,您能解释一下在这种情况下有和没有super()的区别吗 class SomeThread extends Thread { String ThreadName; SomeThread(String ThreadName) { super(ThreadName); //Why Oh Why ? this.Thre

super()用于从子类的构造函数中执行超类的构造函数。在这个程序中,无论构造函数中是否包含super(),输出都保持不变。那么,您能解释一下在这种情况下有和没有super()的区别吗

    class SomeThread extends Thread {
    String ThreadName;

    SomeThread(String ThreadName) {
        super(ThreadName); //Why Oh Why ?
        this.ThreadName = ThreadName;
    }

    public void run(){
        for(int ctr=1; ctr<=10; ctr++) {
            System.out.println("From "+ThreadName+"...."+ctr);
            try {
                sleep(1000);
            }catch(Exception e) {
                System.out.println("Exception in "+ThreadName);
            }
        }
    }

}

class ThreadAliveDemo {
    public static void main(String[] args) throws Exception {
        SomeThread FThread = new SomeThread("Some Child Thread");
        System.out.println("Some Child Thread is alive "+FThread.isAlive());

        FThread.start();

        System.out.println("Some Child Thread is running.."+FThread.isAlive());

        for(int ctr = 1; ctr<=5; ctr++) {
        System.out.println("From.."+Thread.currentThread().getName()+"..."+ctr);
        Thread.sleep(1000);
        }

        FThread.join();

        System.out.println("Some Child Thread is alive.."+FThread.isAlive());

        for(int ctr=6; ctr<=10; ctr++) {
        System.out.println("From.."+Thread.currentThread().getName()+"..."+ctr);
        Thread.sleep(1000);
        }
    }
}
class SomeThread扩展线程{
字符串ThreadName;
SomeThread(字符串ThreadName){
super(ThreadName);//为什么?
this.ThreadName=ThreadName;
}
公开募捐{

对于(int ctr=1;ctr调用超类构造函数
Thread(String name)
可以显式设置系统线程名称,稍后可以使用
Thread.currentThread().getName()获得该名称
。如果不显式调用超类构造函数,将使用默认构造函数来指定默认线程名称,如
thread-1
。这些线程名称可以出现在调试器UI、
jstack
输出等中,因此最好为线程指定有意义的名称。例如,在运行Eclipse调试器中的当前代码,您将看到:

因此,您可以看到
线程[某些子线程]
。但如果删除该超级调用,您将看到以下内容:

现在它只是
Thread[Thread-0]
super(ThreadName);
语句调用类的
Thread(String name)
构造函数。如参数所示,它设置
线程的名称

虽然在本例中设置
thread
的名称可能不直接有用,但一般来说,
thread
名称在调试时可能有用,因为您可以将线程名称添加到应用程序的日志中。

如果您确实像以前那样调用super,那么您将根据JavaDo调用以下构造函数c:

公共线程(字符串名称)

分配新的线程对象。此构造函数与线程(null,null,name)具有相同的效果

所以
super(ThreadName)
调用
super(null,null,ThreadName)

如果删除对
super(ThreadName)
的调用,JVM将自动为您调用空构造函数
super()
。根据JavaDoc,您最终将进行几乎相同的调用:

线 公共线程() 分配一个新的线程对象。此构造函数与

线程(null,null,gname),其中gname是新生成的名称。自动生成的名称的形式为“Thread-”+n,其中n是整数

因此
super()
调用
super(null,null,gname)
,其中
gname
是线程自动生成的名称


调用和不调用super()之间行为的唯一区别是线程名称的分配。

为什么要首先扩展线程?如果我是你,我会创建一个实现runnable的类并将其提供给一个新线程:
new Thread(runnable r)
或一个方法:
new Thread(()->method())
但这不是我的问题:)@Gelunox扩展
线程
没有本质上的错误。请查看下面给出的答案。