【问题标题】:Thread methods call without Thread instance没有 Thread 实例的线程方法调用
【发布时间】:2016-01-12 12:42:33
【问题描述】:

为什么这个类在第 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,main]

8 线程-0 5 线程[线程-0,5,main]

谢谢,

【问题讨论】:

  • 因为extends Thread.
  • 您期待什么错误?
  • 在 System.out.println(getId + ....); 行中,因为实例方法 a 在没有实例的情况下被调用,或者如果是隐式方法,那么它是什么?什么线程的 id = 8 ?谢谢,

标签: java multithreading


【解决方案1】:

@Tunaki 很到位。我只是补充他所说的话。

一共有三个 Thread 对象。

  1. 主线程对象,它是一个 java.lang.Thread
  2. T1 线程对象,它是一个 java.lang.Thread
  3. Bang 线程对象是一个 Bang

请注意,主线程和 T1 线程作为单独的线程生成,而 Bang 线程未生成

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

Thread.currentThread().getId() 将返回正在运行的线程 T1 的 id,即 9

this.getId() 将返回 Bang 对象的 id,即 8。还记得,您在 T1 对象之前创建了 Bang 对象吗?这就是为什么 Bang 具有较小的 id 8,而 T1 具有较高的 threadId 9

希望这会有所帮助。我已更新您的代码以打印有关哈希码和类详细信息的更多信息。输出应该给出清晰的图片。

代码:

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
===================================

【讨论】:

  • 太棒了!非常感谢!
  • 如果这完全回答了你的问题,你可以接受这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2011-09-30
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多