gpt4 book ai didi

java - 线程 getName() 返回错误的名称

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:30 24 4
gpt4 key购买 nike

好吧,我知道这可能是我对线程如何真正工作的理解很糟糕,但在有人帮助我理解之前我会相信这是一个错误 :)

在我的主类及其 main() 方法中,我有:

public static void main(String args[]){
StoneBucket stoneBucket = new StoneBucket();
StonePutter spRunnable = new StonePutter(stoneBucket);
StoneThrower stRunnable = new StoneThrower(stoneBucket);
StoneThrower stRunnable2 = new StoneThrower(stoneBucket);

//Create the Threads that will take the Runnables as arguments
Thread puttingThread = new Thread(spRunnable);
Thread throwingThread = new Thread(stRunnable);
Thread throwingThread2 = new Thread(stRunnable);

puttingThread.setName("Putter");
throwingThread.setName("Thrower 1");
throwingThread2.setName("Thrower 2");
[...]

然后在我的 StoneThrower 课上

public class StoneThrower implements Runnable{

private StoneBucket sb;
private String name;

public StoneThrower(StoneBucket _sb){
this.sb = _sb;
}

public void run(){

name = Thread.currentThread().getName();
System.out.println("T::"+name+" started...");
int count = 0;
while(true){
[...]

当我编译并运行这段代码时,我得到:

Screenshot of 2 threads...

所以,我的问题是为什么这两个线程都为 currentThread().getName() 返回相同的名称?创建它们时,它们通过 threadX.setName("XXX") 分配了名称,并且这些可运行对象通过调用 threadX.start() 启动...有人可以向我解释一下吗?

编辑:我接受了正确的答案,因为将 stRunnable 更改为 stRunnable2 的行为符合预期。现在真正的问题是为什么会发生这种情况。我创建了两个线程并分别启动它们。 run() 方法(在线程创建时调用一次)返回错误名称是怎么回事?

最佳答案

发生这种情况是因为您将线程名称存储在 StoneThrower 的实例变量 name 中。由于并发性,第二个线程覆盖了第一个线程刚刚设置的 name 的值,并且它们都输出相同的值。

这是您的场景:

1. Thread1#start
2. Thread2#start
3. Thread1#runnable#run -> runnable.name = 'Thrower 1'
4. Thread2#runnable#run -> runnable.name = 'Thrower 2' // overrides
5. Thread1#runnable#run -> System.out.println(runnable.name)
6. Thread2#runnable#run -> System.out.println(runnable.name)

关于java - 线程 getName() 返回错误的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614143/

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