A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Fightingforever 中级黑马   /  2014-10-23 10:11  /  1568 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. 代码1:
  2. class Test extends Thread
  3. {
  4.         private String name;
  5.         Test(String name)
  6.         {
  7.                 this.name=name;
  8.                 }
  9.         public void run()
  10.         {
  11.                 for(int x=0;x<60;x++)
  12.                 {
  13.                         System.out.println(Thread.currentThread().getName()+"...run..."+x);
  14.                         }
  15.                 }
  16.         }
  17.        
  18. class ThreadTest
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 Test t1=new Test("one");
  23.                 Test t2=new Test("two");
  24.                 t1.start();
  25.                 t2.start();
  26.                 }
  27.         }

  28. 代码2:
  29. class Test extends Thread
  30. {
  31.         private String name;
  32.         Test(String name)
  33.         {
  34.                 this.name=name;
  35.                 }
  36.         public void run()
  37.         {
  38.                 for(int x=0;x<60;x++)
  39.                 {
  40.                         System.out.println(Thread.currentThread().getName()+"...run..."+x);
  41.                         }
  42.                 }
  43.         }
  44.        
  45. class ThreadTest
  46. {
  47.         public static void main(String[] args)
  48.         {
  49.                 Test t1=new Test("one");
  50.                 Test t2=new Test("two");
  51.                 t1.start();
  52.                 t2.start();
  53.                 }
  54.         }
  55. 代码1和代码2都是想获线程t1和t2自定义的名称one、two,但是代码1为什么不能实现自定义的名称呢?代码1输出的为默认的名称!
复制代码


评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

15 个回复

倒序浏览
康师傅-蛋黄派 来自手机 中级黑马 2014-10-23 10:42:22
沙发
表示还没有学到线程,白看半天代码了
回复 使用道具 举报
额?没有人回复我吗?纠结很久的问题啦!
回复 使用道具 举报
我实在是找不到两个代码的区别,我运行了一下第一个代码,class
ThreadTest
{
        public static void main(String[] args)
        {
                Test t1=new Test("one");
                Test t2=new Test("two");
                t1.start();
                t2.start();
                }
        }这里要加上public,
还有你的问题,你说不能设置线程名是因为创建对象时候构造器初始化name的值是你定义的private String name;值,
设置线程名的值是 thread对象调用setName(String name)方法
public class ThreadTest {
        public static void main(String[] args) {
                TestThread t1 = new TestThread("one");
                t1.setName("线程一");
                TestThread t2 = new TestThread("two");
                t2.setName("线程二");
                t1.start();
                t2.start();
        }
}这样就能设置线程名了
回复 使用道具 举报
两个代码一样的,为啥会不一样~同问  应该是自定义的名称one、two  我也试试
回复 使用道具 举报
hanxing 发表于 2014-10-25 09:54
我实在是找不到两个代码的区别,我运行了一下第一个代码,class
ThreadTest
{
  1. 代码1
  2. class Test extends Thread
  3. {
  4.       
  5.         Test(String name)
  6.         {
  7.                 super(name);
  8.                 }
  9.         public void run()
  10.         {
  11.                 for(int x=0;x<60;x++)
  12.                 {
  13.                         System.out.println(Thread.currentThread().getName()+"...run..."+x);
  14.                         }
  15.                 }
  16.         }
  17.         
  18. class ThreadTest
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 Test t1=new Test("one");
  23.                 Test t2=new Test("two");
  24.                 t1.start();
  25.                 t2.start();
  26.                 }
  27.         }
  28. 代码2
  29. class Test extends Thread
  30. {
  31.       private String name;
  32.         Test(String name)
  33.         {
  34.               this.nam=name;
  35.                 }
  36.         public void run()
  37.         {
  38.                 for(int x=0;x<60;x++)
  39.                 {
  40.                         System.out.println(Thread.currentThread().getName()+"...run..."+x);
  41.                         }
  42.                 }
  43.         }
  44.         
  45. class ThreadTest
  46. {
  47.         public static void main(String[] args)
  48.         {
  49.                 Test t1=new Test("one");
  50.                 Test t2=new Test("two");
  51.                 t1.start();
  52.                 t2.start();
  53.                 }
  54.         }

  55. 实在不好意思发错了
复制代码
回复 使用道具 举报
两个代码运行的结果一样,都是默认名
class Thread{
      private char[] name;
      public final void setName(String paramString)
      {
           checkAccess();
           this.name = paramString.toCharArray();
       }

       public final String getName()
       {
           return String.valueOf(this.name);
       }
}
而你自己定义了private String name;构造函数只是给子类的新变量name赋值,没给父类的name赋值,故给线程名赋值用setName
回复 使用道具 举报
staycolorful 发表于 2014-10-25 10:40
两个代码运行的结果一样,都是默认名
class Thread{
      private char[] name;

构造函数中调用了super(name)的输出的为 one two,而没有调用super(name)的输出的是Thread-1和Thread-2
回复 使用道具 举报
Fightingforever 发表于 2014-10-25 11:30
构造函数中调用了super(name)的输出的为 one two,而没有调用super(name)的输出的是Thread-1和Thread-2 ...

是这样的   没有看到楼主将第一个代码已经改了
第二个未调用super(name),调用父类无参数构造函数
  1. public Thread()
  2. {
  3.           init(null,null, "Thread-"nextThreadNum(), 0L);
  4. }
复制代码

第一个调用super(name),调用父类含参数构造函数
  1. public Thread(String paramString)
  2. {
  3.      init(null, null, paramString, 0L);
  4. }
复制代码
回复 使用道具 举报
staycolorful 发表于 2014-10-25 12:37
是这样的   没有看到楼主将第一个代码已经改了
第二个未调用super(name),调用父类无参数构造函数

但是子类继承了父类的方法呀 那Thread.currentThread()应该是获取子类中的线程啊 getName()是不是应该也是子类中的 也就是不用写super(name)构造函数  以上两个函数输出应该是一样的吧
回复 使用道具 举报
Fightingforever 发表于 2014-10-25 14:34
但是子类继承了父类的方法呀 那Thread.currentThread()应该是获取子类中的线程啊 getName()是不是应该也 ...

子类不继承父类的构造方法,使用父类的构造方法用super:
子类的构造方法总是先调用父类的某个构造方法,如果子类的构造方法没有明显的指名使用父类的哪个构造方法,那么子类就调用父类的不带参数的构造方法,如果想指名调用,需使用super调用父类构造方法,而且super必须是子类构造方法中的第一条语句。

回复 使用道具 举报
多看看视频吧,我也看到多线程了
回复 使用道具 举报
小孩别靠近 发表于 2014-10-26 11:42
多看看视频吧,我也看到多线程了

你的技术分怎么这么高呀
回复 使用道具 举报
Fightingforever 发表于 2014-10-26 21:40
你的技术分怎么这么高呀

黑马币可以换积分,6个黑马币换一个积分
回复 使用道具 举报
小孩别靠近 发表于 2014-10-26 22:08
黑马币可以换积分,6个黑马币换一个积分

这个不是要税的吗 其实我觉得先自己挣技术分吧 这样可以激励自己好好学习 发现问题 努力回答别人的问题 达到巩固知识的目的 等到最后实在不够了 再兑换   不知道你认同不 一起加油
回复 使用道具 举报
Fightingforever 发表于 2014-10-26 22:16
这个不是要税的吗 其实我觉得先自己挣技术分吧 这样可以激励自己好好学习 发现问题 努力回答别人的问题  ...

恩恩,是的,一起奋斗吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马