CurrentThread 및 this의 차이점
14236 단어 다중 스레드 및 동시 실행
/**
* @Auther:
* @Date: 2020/8/18 11:50
* @Description:
*/
public class Test03 {
public static void main(String[] args) {
A a = new A();
Thread t = new Thread(a);
t.setName("B");
t.start();
}
}
class A extends Thread{
public A() {
System.out.println("A ");
System.out.println("currentthread.getname()="+Thread.currentThread().getName());
System.out.println("currentthread.isalive()="+Thread.currentThread().isAlive());
System.out.println("this.getname()="+this.getName());
System.out.println("this.isAlive()="+this.isAlive());
System.out.println("A ");
}
@Override
public void run() {
System.out.println("run ");
System.out.println("currentthread.getname()="+Thread.currentThread().getName());
System.out.println("currentthread.isalive()="+Thread.currentThread().isAlive());
System.out.println("this.getname()="+this.getName());
System.out.println("this.isAlive()="+this.isAlive());
System.out.println("run ");
}
}
"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=50431:D:\IntelliJ IDEA\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program "
A
currentthread.getname()=main
currentthread.isalive()=true
this.getname()=Thread-0
this.isAlive()=false
A
run
currentthread.getname()=B
currentthread.isalive()=true
this.getname()=Thread-0
this.isAlive()=false
run
Process finished with exit code 0
이 결과는 내가 처음에 어떻게 된 일인지 몰랐는데 마지막에 두 번째 줄까지 생각하고 한참 동안 생각했지만 통하지 않아서 몇 가지 자료를 찾아보고 나서야 구체적인 원인을 알았다.우리 먼저 아래의 원본 코드를 봅시다.
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
@Override
public void run() {
if (target != null) {
target.run();
}
}
제 코드는요.
원본을 통해this가 가리키는 것은 new Thread(a)의 a 대상이다. 이것은 나로 하여금 앞의 에이전트 모델을 떠올리게 한다. a 대상은 이때 일반적인run 방법을 사용했을 뿐이고 틀림없이false이다.