环境:使用一:代码示例
创建继承Thread类的CountOperate
package com.kgf.test;
public class CountOperate extends Thread {
public CountOperate() {
System.out.println("CountOperate---begin");
System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
System.out.println("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive());
System.out.println("this.getName()="+this.getName());
System.out.println("this.isAlive()="+this.isAlive());
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("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive());
System.out.println("this.getName()="+this.getName());
System.out.println("this.isAlive()="+this.isAlive());
System.out.println("Thread.currentThread() == this : " + (Thread.currentThread() == this));
System.out.println("run---end");
}
}
创建测试类
package com.kgf.test;
public class Run {
public static void main(String[] args) {
CountOperate myThread = new CountOperate();
myThread.setName("A");
myThread.start();
}
}
效果如下:
CountOperate—begin
Thread.currentThread().getName()=main
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
CountOperate—end
run—begin
Thread.currentThread().getName()=A
Thread.currentThread().isAlive()=true
this.getName()=A
this.isAlive()=true
Thread.currentThread() == this : true
run—end
分析原因
⑴先说构造方法中的代码结果
a:
Thread.currentThread().getName()=main
Thread.currentThread().isAlive()=true
上面这个结果是我们在实例化CountOperate对象时,调用无参构造时产生的,
并且调用CountOperate构造方法是主线程main。
b:
this.getName()=Thread-0
this.isAlive()=false
上面这个结果,首先我们需要搞清楚this代表的是什么?它代表的其实就是CountOperate类对象的引用,
是个线程类(它继承了Thread线程类),但是这个线程类并没有设置名字,所以Thread默认给了一个Thread-0,
默认名字的规则定义如下:
因为仅仅是运行构造方法,还未运行线程,所以this.isAlive() = false
⑵再说run方法中的代码结果
a:
Thread.currentThread().getName()=A
Thread.currentThread().isAlive()=true
当前线程名字为A,A是我们手动赋予的myThread.setName("A");,并且它是运行着的
b:
this.getName()=A
this.isAlive()=true
Thread.currentThread() == this : true
因为,我们运行的线程就是MyThread的引用,而this也是MyThread的引用,所以相同,结果也是一样。
下面我们保持线程类不变,修改我们的测试类
⑴修改测试类
package com.kgf.test;
public class Run {
public static void main(String[] args) {
CountOperate myThread = new CountOperate();
Thread thread = new Thread(myThread,"A");
thread.start();
}
}
⑵效果
CountOperate—begin
Thread.currentThread().getName()=main
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
CountOperate—end
run—begin
Thread.currentThread().getName()=A
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
Thread.currentThread() == this : false
run—end
⑶先说构造方法中的代码结果
a:
Thread.currentThread().getName()=main
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
上面这个结果是我们在实例化CountOperate对象时,调用无参构造时产生的,
并且调用CountOperate构造方法是主线程main。上面这个结果,首先我们需
要搞清楚this代表的是什么?它代表的其实就是CountOperate类对象的引用,
是个线程类(它继承了Thread线程类),但是这个线程类并没有设置名字,
所以Thread默认给了一个Thread-0
⑷再说run方法中的代码结果
a:
Thread.currentThread().getName()=A
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
Thread.currentThread() == this : false
从上面我们会发现this 与 Thread.currentThread()不是同一个引用,
从测试类我们可以发现,我们启动线程的用的是thread对象,里面
我们的构造参数是myThread,赋给Thread类中的属性target,之
后在Thread的run方法中调用target.run();此时Thread.currentThread()
是Thread的引用newThread, 而this依旧是MyThread的引用,所以是
不一样的,打印的内容也不一样。