Java 没有线程实例的线程方法调用

Java 没有线程实例的线程方法调用,java,multithreading,Java,Multithreading,为什么该类在第11行编译时没有错误,以及如何解释最后一行输出: class Bang extends Thread { static Thread t1; public static void main(String[] args) throws Exception { System.out.println("main thread ID = " + Thread.currentThread().getId()); t1 = new Threa

为什么该类在第11行编译时没有错误,以及如何解释最后一行输出:

class Bang extends Thread {

    static Thread t1;

    public static void main(String[] args) throws Exception {
        System.out.println("main thread ID = " + Thread.currentThread().getId());
        t1 = new Thread(new Bang());
        t1.setPriority(7);
        t1.setName("T1");
        t1.start();
    }

    public void run() {
        Thread th = Thread.currentThread();
        System.out.println(th.getId() + " " + th.getName() + "        "
                + th.getPriority() + "  " + th.toString() + "\n");
        System.out.println(getId() + " " + getName() + "  " + getPriority()
                + "  " + toString());
    }
}
输出:

主螺纹ID=1 9 T1 7螺纹[T1,7,主螺纹]

8螺纹-0 5螺纹[螺纹-0,5,主螺纹]


谢谢,

@Tunaki很合适。我只想补充一下他说的话

总共有三个线程对象

  • 主线程对象,它是java.lang.Thread
  • T1线程对象,它是java.lang.thread
  • “砰”线程对象,即“砰”
  • 请注意,主线程和T1线程是作为单独的线程生成的,而Bang线程是未生成的

    run
    方法中打印的内容正在线程T1上运行

    Thread.currentThread().getId()
    将返回运行线程的idT1,即9

    this.getId()
    将返回Bang对象的id,该对象为8。记住,您在T1对象之前创建了Bang对象?这就是为什么Bang具有较小的id8,而T1具有较高的threadId9

    希望这有帮助。我已经更新了您的代码,以打印有关hashcode和类详细信息的更多信息。输出应给出清晰的图像

    代码: 输出
    因为
    扩展了线程
    。您希望出现什么错误?In-line System.out.println(getId+..);,因为实例方法a调用时没有实例,或者如果是隐式的,那么是什么?哪个线程的id=8?谢谢,太好了!非常感谢你!如果这完全回答了你的问题,你可以接受这个答案。
    class Bang extends Thread {
    
        static Thread t1;
    
        public static void main(String[] args) throws Exception {
            System.out.println("main thread ID = " + Thread.currentThread().getId());
            Bang bang = new Bang(); //Creating a local variable so we can print the object details.
            t1 = new Thread(bang);
            t1.setPriority(7);
            t1.setName("T1");
            threadInfo(bang);
            threadInfo(t1);
            t1.start();
        }
        public void run() {
            threadInfo(this);
        }
        public static void threadInfo(Thread argThreadObject) {
            System.out.println("===================================");
            Thread currentThreadObject = Thread.currentThread();
            printThreadInfo("currentThreadObject", currentThreadObject);
            printThreadInfo("argThreadObject", argThreadObject);
            System.out.println("===================================");
        }
        public static void printThreadInfo(String threadObjId, Thread threadObject) {
            System.out.println(
                    threadObjId + ": " 
                    + threadObject.getId() + ":"
                    + threadObject.getName() + ":" 
                    + threadObject.getPriority() + ":" 
                    + threadObject.toString() + " instanceId: "
                    + threadObject.hashCode() + "@"
                    + threadObject.getClass().getName());
        }
    }
    
    main thread ID = 1
    ===================================
    currentThreadObject: 1:main:5:Thread[main,5,main] instanceId: 1113847530@java.lang.Thread
    argThreadObject: 9:T1:7:Thread[T1,7,main] instanceId: 820485811@java.lang.Thread
    ===================================
    ===================================
    currentThreadObject: 1:main:5:Thread[main,5,main] instanceId: 1113847530@java.lang.Thread
    argThreadObject: 8:Thread-0:5:Thread[Thread-0,5,main] instanceId: 912528090@Bang
    ===================================
    ===================================
    currentThreadObject: 9:T1:7:Thread[T1,7,main] instanceId: 820485811@java.lang.Thread
    argThreadObject: 8:Thread-0:5:Thread[Thread-0,5,main] instanceId: 912528090@Bang
    ===================================