java和多线程中的超级关键字

时间:2014-01-21 16:09:29

标签: java multithreading super

我是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");

       }
    }

线路是什么 的 超级(STR) ;
在这种情况下呢?
据我所知,它调用线程的构造函数 线程(字符串名称) 类。这反过来又创建了一个新的Thread对象 但是在输出中可以看到传入 CustomThread CustomThread1 的构造函数中的String正在传入 共享 类的 void show(String s,int a)
请解释实际发生的事情?
谢谢!

3 个答案:

答案 0 :(得分:3)

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

所有java构造函数都必须从超类中调用一个或另一个构造函数。默认情况下,会调用no-args构造函数,但是这样您就可以显式指定要调用的超类构造函数。

采用String参数的Thread类构造函数创建一个具有特定名称的Thread(而不是自动生成的名称,如Thread-1)。

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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