我是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) ?
请解释实际发生的事情?
谢谢!
答案 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);
。由于您将线程名称设置为给定的字符串str
,Thread.currentThread().getName()
将返回相同的字符串。