先说定义:
this.getName()是一个实例方法:反映这个实例的情况,实例指的就是这个类的对象
Thread.currentThread().getName() 是一个静态方法:反映这个实体的情况,实体却不一样,实体是指正在发生这个作用的实例
接下来具体说明1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34class Demo1 extends Thread
{
String name;
public Demo(String name)
{
this.name = name;
}
public void run()
{ System.out.println(Thread.currentThread().getName()+"..."+name);
}
}
class Demo2 extends Thread
{
String name;
public Demo(String name)
{
this.name = name;
}
public void run()
{
System.out.println(getName()+"..."+name);
}
}
public class ThreadDemo {
public static void main(String args[])
{
Demo A = new Demo("a");
Demo B = new Demo("b");
A.start();
A.run();
B.start();
B.run();
}
}
打印结果
main…a
Thread-0…a
Thread-1…b
Thread-1…b
(顺序不影响)
(这里就要谈到调用start和调用run的区别
start会完成两件事:1.开启线程 2.调用run方法
所以用start才是开启多线程,run实际上还是原来的线程。)
打印出 main…a 的原因是因为T.c().g()方法返回的是实际上调用start方法的对象的线程名,A.run()并没有创建新线程
打印出 Thread-0…a 的原因是因为A.start()创建了新线程。
那么为什么调用B.run()却打印出 Thread-1…b 的原因是因为getName()方法返回的是this指向的对象的线程名(run定义了该线程该如何做,但实际运行该线程的是main线程)所以打印Thread-1,但实际上是main在运行。