【问题标题】:Super keyword in java and multithreadingjava和多线程中的超级关键字
【发布时间】:2014-01-22 00:25:44
【问题描述】:

我是 Java 世界的新手。 在学习多线程时,我遇到了这个程序:-

class Shared 
{
 int x;
 synchronized void show(String s,int a)
{
  x=a;
  System.out.println("Starting in method" +s+  " " +x);
  try 
  {
     Thread.sleep(2000);
  }
  catch (Exception e)
  {
   System.out.println("Ending from method" +s+ " " +x);   
  }   
 }
}
class CustomThread extends Thread
{
  Shared s;
  public CustomThread(Shared s,String str)
{
 super (str);
  this.s=s;
  start();
}
 public void run()
{
 s.show(Thread.currentThread().getName(),10 );
}
}  

class CustomThread1 extends Thread
 {
    Shared s;
    public CustomThread1(Shared s,String str)
  {
     super (str);
  this.s=s;
  start();
}
   public void run()
  {
   s.show(Thread.currentThread().getName(),20);
  }
}   
class RunSyn
{
   public static void main(String...s)
   {
      Shared st=new Shared();
      CustomThread t1=new CustomThread(st,"one");
      CustomThread1 t2=new CustomThread1(st,"two");

       }
    }

行是什么
super(str);
在这种情况下呢?
据我了解,它调用构造函数 Thread (String name)Thread 班级。这又会创建一个新的 Thread 对象。
但是在输出中可以看到 CustomThreadCustomThread1 的构造函数中传递的字符串正在被传递Shared 类的 void show (String s,int a)
请解释一下实际发生了什么?
谢谢!!

【问题讨论】:

  • super(...) 与上下文无关。它始终服务于相同的目的,使用您传递给它的任何参数调用超级构造函数。

标签: java multithreading super


【解决方案1】:

super(String) 语句是显式的超类构造函数调用。

所有 java 构造函数都必须从它们的超类调用一个或另一个构造函数。默认情况下会调用无参数构造函数,但通过这种方式,您可以显式指定要调用的超类构造函数。

采用String 参数的Thread 类构造函数创建具有特定名称的Thread(与自动生成的名称相反,例如Thread-1)。

确定完整程序做什么的最简单方法是实际执行它。

当调用Thread 实例的start() 方法时,线程开始执行(最终调用run() 方法)。如您所见,在这种情况下,CustomThread1 类的run() 方法只是调用其Shared 实例的show(String, int) 方法,该方法会打印传递到控制台的任何内容。

【讨论】:

    【解决方案2】:

    正如其他人所指出的,super(str) 方法调用Thread 的构造函数。这会覆盖默认功能,即在构造函数的开头注入 super() 调用。

    至于它的作用,传递给 Thread 的字符串会给线程一个名字。这将允许您在调试会话和线程转储中轻松识别线程。如果没有字符串,它将有一个无聊的名称,例如“Thread-5”。

    【讨论】:

      【解决方案3】:

      您的构造函数调用两个方法:super(str)start()。 第一个方法是超类的构造函数,所以Thread(String) 创建了一个新的 Thread 对象,以给定的字符串作为名称。

      第二种方法start()实际上是创建并启动一个新线程。在这个新线程中,调用了run()方法(类似于整个程序的main(),只不过是针对一个线程)。然后此方法调用s.show(Thread.currentThread().getName(),10);。由于您将线程名称设置为给定字符串str,因此Thread.currentThread().getName() 返回相同的字符串。

      【讨论】: