这一章节我们来讨论一下currentThread()。
我们下面通过一段代码来解释几个问题:
package com.ray.deepintothread.ch01.topic_3; public class CurrentThreadSample { public static void main(String[] args) { ThreadFive threadFive = new ThreadFive(); Thread thread = new Thread(threadFive, "myThread");// 设置运行线程的名称 threadFive.setName("threadFive");// 设置实例的名称 threadFive.myTest(); thread.start(); } } class ThreadFive extends Thread { public void myTest() { show(); } private void show() { System.out.println("----------begin----------"); // 这里指的是执行这个线程的名称 System.out.println("Thread name:" + Thread.currentThread().getName()); System.out.println(this); // this.getName指的是这个实例的名称 // 由于是继承Thread,Thread本身可以设置名称 System.out.println("Instance name:" + this.getName()); System.out.println("----------end----------"); } @Override public void run() { super.run(); show(); } }
----------begin----------
Thread name:main
Thread[threadFive,5,main]
Instance name:threadFive
----------end----------
----------begin----------
Thread name:myThread
Thread[threadFive,5,main]
Instance name:threadFive
----------end----------
1.currentThread()的作用
作用就是得到当前线程的对象。
如上面的代码,通过currentThread()我们可以轻易的就得到当前线程的名称,我们还可以通过线程对象,得到其他的属性。
2.currentThread()和this
上面的注释也写清楚了。
一开始我也混淆了,因为ThreadFive是继承Thread,想当然的把this想成是当前线程,但其实是当前实例,因此两者虽然都是getName,但是得到的是不同的结果
3.ThreadFive是任务,而不是线程
我们必须要清楚的理清new ThreadFive()和new Thread(threadFive),这两者是有根本性的区别。
new ThreadFive()是创建一个任务实例,而不是具体线程
new Thread(threadFive)是把threadFive这个任务实例放到thread这个线程里面执行
4.搞懂了第三个问题,我把上面的代码改成更加混淆,大家也不怕了
一开始我对两个setName都混淆在一起的。
package com.ray.deepintothread.ch01.topic_3; public class CurrentThreadSample { public static void main(String[] args) { ThreadFive threadFive = new ThreadFive(); Thread thread = new Thread(threadFive); thread.setName("myThread");// 设置运行线程的名称 threadFive.setName("threadFive");// 设置实例的名称 threadFive.myTest(); thread.start(); } } class ThreadFive extends Thread { public void myTest() { show(); } private void show() { System.out.println("----------begin----------"); // 这里指的是执行这个线程的名称 System.out.println("Thread name:" + Thread.currentThread().getName()); System.out.println(this); // this.getName指的是这个实例的名称 // 由于是继承Thread,Thread本身可以设置名称 System.out.println("Instance name:" + this.getName()); System.out.println("----------end----------"); } @Override public void run() { super.run(); show(); } }
我的github:https://github.com/raylee2015/DeepIntoThread