Java 线程初学者:什么';在子类';s(扩展线程类)构造函数?
super()用于从子类的构造函数中执行超类的构造函数。在这个程序中,无论构造函数中是否包含super(),输出都保持不变。那么,您能解释一下在这种情况下有和没有super()的区别吗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
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扩展线程
没有本质上的错误。请查看下面给出的答案。