CurrentThread 및 this의 차이점

우리는this가 현재의 대상을 가리키는 것을 알고 있다.currentThread는 현재 실행 중인 라인을 가리킨다. 그러면 그들은 어떤 관계가 있는가?다음 코드를 봅시다.
/**
 * @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();
        }
    }

제 코드는요.
  • Thread t = new Thread(a);
  • System.out.println(“this.isAlive()”+this.isAlive());

  • 원본을 통해this가 가리키는 것은 new Thread(a)의 a 대상이다. 이것은 나로 하여금 앞의 에이전트 모델을 떠올리게 한다. a 대상은 이때 일반적인run 방법을 사용했을 뿐이고 틀림없이false이다.

    좋은 웹페이지 즐겨찾기