黑马程序员技术交流社区
标题:
Java创建线程命名问题
[打印本页]
作者:
周学彬
时间:
2013-10-20 13:18
标题:
Java创建线程命名问题
本帖最后由 周学彬 于 2013-10-20 17:01 编辑
public class ThreadDemo {
public static void main(String[] args) {
Test t_1 = new Test("one");
Test t_2 = new Test("two");
t_1.start();
t_2.start();
}
}
class Test extends Thread {
private String name;
Test (String name) {
this.name = name;
}
public void run() {
System.out.println(this.getName());
for (int i = 0; i < 60; i++) {
System.out.println(Thread.currentThread().getName() + "...run" + " " + i + " times.");
}
}
}
复制代码
如上段代码所示,创建一个Test子类继承Thread,并有自己的构造方法。构造方法里有要传递的参数,参数即为该线程的名称
按理说,Test类创建对象并启动时,线程通过getName()方法获取的应该是往构造函数里面传递的name参数,但是打印出来的结果却是默认的Thread-0
视频里是用super(name)的方法直接继承父类的构造方法,这个可以理解。但是不使用super方法应该也能达到同样的目的啊,为什么却是默认的线程名称呢?
求解。
作者:
毋须繁华
时间:
2013-10-20 14:00
public class ThreadDemo {
public static void main(String[] args) {
Thread t_1 = new Test("one");
Thread t_2 = new Test("two");
t_1.start();
t_2.start();
}
}
class Test extends Thread {
private String name;
Test (String name) {
super.setName(name);
}
public void run() {
System.out.println(this.getName());
for (int i = 0; i < 60; i++) {
System.out.println(Thread.currentThread().getName() + "...run" + " " + i + " times.");
}
}
}
复制代码
你继承创建的是自己name…… 有没给父类的构造传什么
作者:
周学彬
时间:
2013-10-20 14:06
我把打印语句的Thread.currentThread().getName()换成this.getName()结果还是默认的Thread-0
作者:
卜弦
时间:
2013-10-20 14:20
本帖最后由 卜弦 于 2013-10-20 14:22 编辑
<P>public class ThreadDemo {
public static void main(String[] args) {
Test t_1 = new Test("one");
Test t_2 = new Test("two");
t_1.start();
t_2.start();
}
}
class Test extends Thread {
private String name;
Test (String name) {
this.name = name;
/*第二种方式
super(name);
*/
}
public void run() {
System.out.println(this.getName());
for (int i = 0; i < 60; i++) {
/*第一种方式
System.out.println(name + "...run" + " " + i + " times.");
System.out.println(Thread.currentThread().getName() + "...run" + " " + i + " times.");
*/
System.out.println(Thread.currentThread().getName() + "...run" + " " + i + " times.");
}
}
}
</P>
复制代码
/*
第一种方式:通过构造函数传入一个字符串,在输出时将字符串加在一起输出。这种方式并不是真的给线程命名,
只是给主观的给线程一个标识,实际上线程名称还是默认的Thread-0...等。
第二种方式:因为线程在构造时可以直接传入名称,同样通过构造函数传入字符串,但是在构造函数里,要调用父类Thread
的构造方法才行。子类调用父类构造函数通过super();因为是调用带参数的构造函数所以采用super(name);
第三种方式:通过setName方法。在主函数里通过以下四句话
Test t_1 = new Test();
Test t_2 = new Test();
t_1.setName("one");
t_2.setName("two");
这时记得把下面的话注释掉,因为通过这种方法,就没必要再用到构造函数了。
/*
private String name;
Test (String name)
{
this.name = name;
}
*/
作者:
流行语
时间:
2013-10-20 14:21
Test继承自Thread,可是在Test构造函数中,你没有显示调用Thread有参数构造函数,这样在构造子类对象的时候,系统将会首先调用Thread的无参构造函数,
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
复制代码
在init函数中,"Thread-" + nextThreadNum()赋值给name属性,所以调用getName()函数时返回Thread-0
public final String getName() {
return String.valueOf(name);
}
复制代码
作者:
我能学编程吗
时间:
2013-10-20 14:55
本帖最后由 我能学编程吗 于 2013-10-20 14:58 编辑
发表个人观点:
我觉得了解问题要本质,我个人认为是楼主没有理解好继承的相关知识点,运行如下代码:
class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
System.out.println(zi.getName()); // 输出结果是: Fu
}
}
class Fu {
public String name = "Fu";
public String getName() {
return name;
}
}
class Zi extends Fu {
public String name = "Zi";
}
复制代码
从上面代码的输出结果可知,子类调用父类的getName方法,访问的是父类的name,而不是子类的name,所以你应该知道问题所在了吧!
你想调用子类的getName来获取子类的name的话,你可以覆盖 父类的getName方法,这样获取name就是子类的name了,如下:
class Zi extends Fu {
public String name = "Zi";
public String getName() {
return name;
}
}
复制代码
但这个覆盖 对于你的Thread的子类不管用,为什么呢?查看Thread的getName方法的源代码如下:
public final String getName() {
return String.valueOf(name);
}
复制代码
我们看到 Thread的getName方法是final的,也就是说是最终的,是不能覆盖的不知道我的这个答案是否比上面的要正确,给点技术分吧!
作者:
周学彬
时间:
2013-10-20 15:04
多谢楼上各位,我看了源码,差不多都明白了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2