java中线程的getname,【java】多线程中Thread.currentThread().getName()和this.getName()的区别...

参考文章:

http://www.cnblogs.com/huangyichun/p/6071625.html

程序一:

public class Run1 {

public static void main(String[] args) {

System.out.println(Thread.currentThread().getName()); //main方法被名字为main的线程调用

}

}

结果很简单,我已经在注释中表明结果了

程序二:

public class MyThread extends Thread {

//类的构造函数是被main线程调用

public MyThread() {

System.out.println("构造方法的打印" + Thread.currentThread().getName());

}

//因为run是自动被调用的方法 所以start()的时候就是被线程Thread-0调用 异步处理

//在程序中直接调用run方法,那是被main线程调用 同步处理

@Override

public void run() {

System.out.println("run方法的打印" + Thread.currentThread().getName());

}

//为什么会是Thread-0

/*

部分源代码:

* public Thread() {

init(null, null, "Thread-" + nextThreadNum(), 0);

}

private static int threadInitNumber;

private static synchronized int nextThreadNum() {

return threadInitNumber++;

}

*

* 从源代码我们就可以发现 "Thread-" + nextThreadNum()

*

* */

public class Run2 {

public static void main(String[] args) {

MyThread mythread = new MyThread();

//mythread.start();

mythread.run();

}

}

需要注意的地方就是调用strat()和run()方法之间的区别

程序三:

public class CountOperate extends Thread {

public CountOperate() {

System.out.println("CountOperate---begin");

System.out.println("Thread.currentThread().getName()="

+ Thread.currentThread().getName());

System.out.println("this.getName()=" + this.getName());

System.out.println("Thread.currentThread()==this :"+ (Thread.currentThread() == this));

System.out.println("CountOperate---end");

}

@Override

public void run() {

System.out.println("run---begin");

System.out.println("Thread.currentThread().getName()="

+ Thread.currentThread().getName());

System.out.println("this.getName()=" + this.getName());

System.out.println("Thread.currentThread()==this :"+ (Thread.currentThread() == this));

System.out.println("run---end");

}

}

public class Run {

public static void main(String[] args) {

CountOperate c = new CountOperate();

//c.start();//千万不要多次调用start() 不然程序是会报错的

/*

输出结果如下:

CountOperate---begin

Thread.currentThread().getName()=main //构造函数被main线程调用

this.getName()=Thread-0 //this.getName()调用的是父类的getName,因此返回Thread-0

Thread.currentThread()==this :false //前者是main线程 后者是类构造函数线程 因此为false

CountOperate---end

run---begin

Thread.currentThread().getName()=Thread-0 //当前运行是new CountOperate()创建的线程

this.getName()=Thread-0 //this 指的就是new CountOperate()创建的线程

Thread.currentThread()==this :true // 因此 结果为true

run---end

* */

//c.run();

/*

输出结果:

CountOperate---begin

Thread.currentThread().getName()=main

this.getName()=Thread-0

Thread.currentThread()==this :false

CountOperate---end

run---begin

Thread.currentThread().getName()=main //如果直接调用run() main线程 而不是线程规划器中的子线程

this.getName()=Thread-0 // this 指的还是new CountOperate()创建的线程

Thread.currentThread()==this :false

run---end

* */

Thread t1 = new Thread(c);

//t1.setName("A");

t1.start();

/*

输出结果:

CountOperate---begin

Thread.currentThread().getName()=main

this.getName()=Thread-0

Thread.currentThread()==this :false

CountOperate---end

run---begin

Thread.currentThread().getName()=Thread-1 //这里线程规划器又重新创建了一个子线程。 如果t1.setName("A"); 那么其结果就是A

this.getName()=Thread-0 //这里this 指的还是new CountOperate()创建的线程实例 而不是new Thread(c)创建的那个实例即c

Thread.currentThread()==this :false

run---end

* */

}

}

这里在结合java源代码进行解释:

public Thread(Runnable target) {

init(null, target, "Thread-" + nextThreadNum(), 0);

}

new Thread(c)会将thread应用对象绑定到一个private的target上面,在t1被执行的时候即t1.run(),它会调用target.run()方法,也就说它是直接调用thread对象的run方法,因此在run方法被执行的时候,this.getName()实际上返回的是target.getName(),而Thread.currentThred().getName()实际上是t1.getName()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值