gpt4 book ai didi

java - getName() 与 Thread.currentThread().getName()。请解释这两者之间的区别

转载 作者:行者123 更新时间:2023-11-29 03:16:22 27 4
gpt4 key购买 nike

public class SynchThread1 extends Thread {
SynchThread1 st;
SynchThread1() {}
SynchThread1(SynchThread1 s) {
st = s;
}
public void run() {
st.show();
}
synchronized void show() {
for (int i = 0; i < 5; i++)
System.out.print(Thread.currentThread().getName() + " "); //replace here
}
public static void main(String[] args) {
SynchThread1 s1 = new SynchThread1();
Thread t1 = new SynchThread1(s1);
Thread t2 = new SynchThread1(s1);
Thread t3 = new SynchThread1(s1);
s1.setName("t0");
t1.setName("t1");
t2.setName("t2");
t3.setName("t3");
t1.start();
t2.start();
t3.start();
}
}

以上代码的输出是:

t1 t1 t1 t1 t1 t3 t3 t3 t3 t3 t2 t2 t2 t2 t2

但是如果我只用 getName() 替换 Thread.currentThread().getName(),输出是:

t0 t0 t0 t0 t0 t0 t0 t0 t0 t0 t0 t0 t0 t0 t0

请解释为什么会这样。

最佳答案

因为 Thread.currentThread().getName() 获取当前运行线程的名称,但 getName() 解析为 st.getName ()st 始终是您的第一个线程实例。

为什么 getName() 解析为 st.getName()?因为:

  1. 在构建第二到第四个线程期间,您将第一个线程作为参数传入并将其保存在实例成员 st 中。

  2. 线程的 run 方法调用 st.show(),因此它们总是在第一个调用 show线。 (如果你启动了第一个线程,你会在那里得到一个 NPE,因为第一个线程的 st 成员永远不会被赋予非 null 值。)

  3. show 中,this 因此是 st(第一个线程)。非限定实例方法调用使用 this 作为它们的实例,this 是第一个线程。

关于java - getName() 与 Thread.currentThread().getName()。请解释这两者之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26322696/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com