多线程中线程名字
最近在看Java多线程编程技术–高洪岩 著,这本书。
里面的currentThread方法这节中写到
currentThread()方法可返回代码段正在被哪个线程调用的信息。
代码如下:
package com.rework.thread.threadgetName;
public class Thread1 extends Thread{
public Thread1() {
System.out.println("构造开始");
System.out.println("Thread.currentThread().getName():"+Thread.currentThread().getName());
System.out.println("this.getName():"+this.getName());
System.out.println("构造结束");
}
@Override
public void run() {
System.out.println("run开始");
System.out.println("Thread.currentThread().getName():"+Thread.currentThread().getName());
System.out.println("this.getName():"+this.getName());
System.out.println("run结束");
}
}
为了区分,我特意标识的子线程的名字
package com.rework.thread.threadgetName;
public class Main {
public static void main(String[] args) {
Thread.currentThread().setName("主线程名main");
Thread1 thread1 = new Thread1();
thread1.setName("真实子线程名");
//thread1.start();
Thread thread = new Thread(thread1);
thread.setName("包装执行子线程名");
thread.start();
}
}
结果:
总结,构造时:
-
currentThread().getName()是当前调用的线程的名字(current是现在,当前的意思)。
主线程main调用thread1的构造,所以当前调用的线程是主线程名main。 -
this.getName(),this表示当前对象,当前对象为Thread1的实例化对象thread1,所以this.getName(),会采用系统默认的名称(因为你new Thread1的时候并没有给它setName(),所以会是默认值)。
-
以下是在newThread1的时候给实例对象this设置名字。
总结,run方法时: -
Thread源码构造,可以传一个Runnable类型的。
-
Thread实现Runnable接口,所以说传参的时候可以传一个thread
new Thread(thread1).start();
(当然也可以自己直接调用start方法)
在执行run方法时候, -
thread包装了thread1,
-
Thread.currentThread().getName()名字,当前线程的名字。
-
this.getName();this是谁调用代表谁,在Thread源码中,thread1传参给了target,target调用了start方法,所以this.getName();是thread1的名字,即真正子线程名。