【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()




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值