黑马程序员技术交流社区

标题: 打印线程名字的问题 [打印本页]

作者: 霍明波    时间: 2012-8-22 23:39
标题: 打印线程名字的问题
class ThreadDemo
{
        public static void main(String[] args)
        {       
                ThreadTest t1 = new ThreadTest("one--");
                ThreadTest t2 = new ThreadTest("two--");
                t1.start();
                t2.start();
                for(int x=0;x<=60;x++)
                {
                        System.out.println("main");
                }
        }
}

class ThreadTest extends Thread
{
        private String name;
        ThreadTest(String name)
        {
                this.name = name;
        }
        public void run()
        {
                for(int x=0;x<=60;x++)
                {
                        System.out.println(this.getName());
                }
        }
}
线程有个可以打印线程名字的方法,我调用了打印的都是现成的默认名字,
而我设定的名字没有打印出来,
能告诉我是怎么回事吗?

作者: 黑马王建伟    时间: 2012-8-23 00:44
我想说,楼主疏忽了,“this.getName”应该写成“this.name”,这样就可以了

未命名.jpg (29.02 KB, 下载次数: 7)

未命名.jpg

作者: 李宁    时间: 2012-8-23 00:47
把ThreadTest的构造方法从
         private String name;
        ThreadTest(String name)
        {
                this.name = name;
        }
改成这样:
ThreadTest(String name)
     {
             super(name);
     }
线程Thread的传入自定义名字的构造方法已经定义好了,继承就好了,你又定义了一个,就把父类的方法盖掉了!!
作者: 芦曦    时间: 2012-8-23 00:49
class ThreadTest extends Thread
{
         //private String name;
      ThreadTest(String name)
       {
        super(name);//这里直接调用父类定义好的方法就行了。其他的都不需要。
                 //this.name = name;
       }
         public void run()
         {
                 for(int x=0;x<10;x++)
                 {
                         System.out.println(this.getName());//这里获取线程名的方法建议写成Thread.currentThread().getName()。
                 }
         }
}
作者: 周世阳    时间: 2012-8-23 00:49
本帖最后由 周世阳 于 2012-8-23 00:51 编辑

原因在于
class ThreadDemo
{
        public static void main(String[] args)
        {        
                ThreadTest t1 = new ThreadTest("one--");
                ThreadTest t2 = new ThreadTest("two--");
                t1.start();
                t2.start();
                for(int x=0;x<=60;x++)
                {
                        System.out.println("main");
                }
        }
}

class ThreadTest extends Thread
{
        private String name;//父类中已经有name变量,你这里却覆盖了父类的name变量
        ThreadTest(String name)
        {
                this.name = name;
        }
        public void run()
        {
                for(int x=0;x<=60;x++)
                {
                        System.out.println(this.getName());//getName是从父类继承的方法,返回的是父类的name,不是子类覆盖的
                }
        }
}

将代码修改下就可以达到你预想的效果
package com.itheima;

public class ThreadDemo
{
        public static void main(String[] args)
        {        
                ThreadTest t1 = new ThreadTest("one--");
                ThreadTest t2 = new ThreadTest("two--");
                t1.start();
                t2.start();
                for(int x=0;x<=60;x++)
                {
                        System.out.println("main");
                }
        }
}
class ThreadTest extends Thread
{
       //去掉覆盖的变量
        ThreadTest(String name)
        {
                super(name);//调用父类的构造方法
        }
        public void run()
        {
                for(int x=0;x<=60;x++)
                {
                        System.out.println(this.getName());
                }
        }
}
作者: 刘芮铭    时间: 2012-8-23 00:55
class ThreadTest extends Thread
{
        private String name;
        ThreadTest(String name)
        {
                super(name);  // 原程序:this.name = name; 细看程序不难发现!你使用this.name = name;
                                    //这句话只是把这个构造方法自定义而已,并没有传递给父类Thread的构造还是Thread(String name);
                                    //所以你调用的还是Thread默认的名称。只有使用super(name)方能传递给父类,才能打印你自己传递的名称!
        }
        public void run()
        {
                for(int x=0;x<=60;x++)
                {
                        System.out.println(this.getName());
                }
        }
}

作者: 贾成龙    时间: 2012-8-23 00:57
继承:Thread类的线程 ,命名用Thread的一个setName()方法!
class ThreadDemo
{
        public static void main(String[] args)
        {        
                       
                ThreadTest t1 = new ThreadTest();
                ThreadTest t2 = new ThreadTest();
                                t1.setName("one--");
                t1.start();                               
                t2.setName("two--");
                t2.start();                               
                for(int x=0;x<=60;x++)
                {
                        System.out.println("main");
                }
        }
}
class ThreadTest extends Thread
{
      
        public void run()
        {
                for(int x=0;x<=60;x++)
                {
                        System.out.println(this.getName());
                }
        }
}
也可以通过子类继承父类中调用,但必须在构造方法实现super(name);
代码如下:
class ThreadDemo
{
        public static void main(String[] args)
        {        
                       
                ThreadTest t1 = new ThreadTest("one--");
                ThreadTest t2 = new ThreadTest("two--");
                t1.start();                       
                t2.start();                       
                for(int x=0;x<=60;x++)
                {
                        System.out.println("main");
                }
        }
}

class ThreadTest extends Thread
{
        private String name;
        ThreadTest(String name)
        {           
               super(name);
        }
        public void run()
        {
                for(int x=0;x<=60;x++)
                {
                        System.out.println(this.getName());
                }
        }
}
作者: 霍明波    时间: 2012-8-23 09:27
已解决,这么多得分得  看哪个呢{:soso_e102:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2