一. 线程基本注意点
(1) Thread的构架函数可接收Runnable及Thread对象。在接收Thread对象时,特别要注意 name属性
public class Test { public static void main(String[] args){ MyThread thread = new MyThread(); Thread t1 = new Thread(thread); t1.setName("A"); t1.start(); } public static class MyThread extends Thread{ public MyThread(){ System.out.println("Thread.currentThread().getName():"+Thread.currentThread().getName()); System.out.println("this.name:"+this.getName()); } @Override public void run() { System.out.println("Thread.currentThread().getName():"+Thread.currentThread().getName()); System.out.println("this.name(run):"+this.getName()); } } }
输出结果为:
Thread.currentThread().getName():main this.name:Thread-0 Thread.currentThread().getName():A this.name(run):Thread-0
我们通常认为输出第四行应该和第三行一致,其实不然。this.getName() 获取的是实例对象thread中的属性值,而在main方法t1.setName(“A”),实际更改的是t1对象的属性,并未更改thread实例对象的name的属性;
另外Thread接收了Runnable及Thread实例对象实际上是直接调用了2个实例的run方法,因此实例所属线程应该是接收他们的线程。