线程初学者:在子类(扩展Thread类)构造函数中使用super()方法有什么意义?

时间:2015-09-20 11:00:17

标签: java multithreading

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

3 个答案:

答案 0 :(得分:5)

调用超类构造函数#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) { [[UINavigationBar appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight]; } ,您可以显式设置 system 线程名称,以后可以使用Thread(String name)获取该名称。如果您没有显式调用超类构造函数,将使用默认构造函数,它将分配默认的线程名称,如Thread.currentThread().getName()。这些线程名称可以出现在调试器UI,Thread-1输出等中,因此为线程分配有意义的名称是个好主意。例如,在Eclipse调试器中运行当前代码时,您将看到:

Thread name

所以你可以看到jstack。但如果您删除该超级电话,您将看到以下内容:

No thread name

现在它只是Thread [Some Child Thread]

答案 1 :(得分:2)

如果你调用super,那么你最终会根据JavaDoc调用以下构造函数:

  

public Thread(String name)

     

分配一个新的Thread对象。此构造函数与 Thread(null,null,name)

具有相同的效果

因此self.gameButton.setBackgroundColor(color)调用self.gameButton.setBackgroundColor(color)

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

  

主题   public Thread()   分配一个新的Thread对象。此构造函数与

具有相同的效果      

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

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

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

答案 2 :(得分:1)

super(ThreadName);语句调用Thread类的Thread(String name)构造函数。正如论据所示,它设置了thread的名称。

虽然在此示例中设置thread的名称可能并不直接有用,但一般来说,thread名称在调试时很有用,因为您可以在应用程序中添加线程名称&# 39; s log。