从头认识多线程-1.3 currentThread()

这一章节我们来讨论一下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();
	}
}

总结:简单介绍了currentThread()的用法,再通过currentThread()的使用来说明任务实例与线程之间的关系。


我的github:https://github.com/raylee2015/DeepIntoThread

你可能感兴趣的:(多线程)