gpt4 book ai didi

java - 线程重新运行run()方法

转载 作者:行者123 更新时间:2023-12-01 11:41:24 25 4
gpt4 key购买 nike

我正在学习多线程概念。我刚刚做了一个简单的 POC,发现了一些奇怪的行为。请帮助我

目标:- 运行 2 个线程,一个是“乌龟”,另一个是“兔子”。让兔子 hibernate 2 秒,只允许乌龟先于兔子完成线程。

我的可运行类

package com.learn;

public class ThreadLearn implements Runnable{

@Override
public void run() {
// TODO Auto-generated method stub
//Thread.currentThread().interrupt();
boolean flag = false;
System.out.println("Running : " +Thread.currentThread().getName());
if(Thread.currentThread().getName().equalsIgnoreCase("Hare")){

try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Flag before Setting : " +flag);
if(!flag){
System.out.println("Winner : " +Thread.currentThread().getName());
flag = true;
System.out.println("Flag after Setting : " +flag);
}


}

}

和我的主要方法类

package com.learn;

public class ThreadExecutor {

public static void main(String args[]){

ThreadLearn l1 = new ThreadLearn();
ThreadLearn l2 = new ThreadLearn();

Thread t1 = new Thread(l1,"Tortoise");
Thread t2 = new Thread(l2,"Hare");
System.out.println("Thread STATE : " +Thread.currentThread().getState());

t1.start();
t2.start();

System.out.println("END STATE : " +t1.getState());
}

}

这是我得到的输出

<小时/>
Thread STATE : RUNNABLE
END STATE : RUNNABLE
Running : Tortoise
Running : Hare
Flag before Setting : false
Winner : Tortoise
Flag after Setting : true
Flag before Setting : false
Winner : Hare
Flag after Setting : true

如果你看到输出,我已经在 run() 中将“flag”设置为 false,在使 hare therad hibernate 2 秒后,Tortoise 线程运行并将标志值设置为“true”,所以当兔子在 2 秒后出现,我的期望是 flag 将为 true,并且 Winner sysout 根本不会被打印。但该标志再次设置为“假”并运行 Hare 的 Winner 系统输出。:( 请帮助我这里发生了什么。

最佳答案

每个线程都有自己的“标志”,因为您创建了 2 个 ThreadLearn 实例。两个标志都是独立的。如果您需要共享“flag”=>您必须将“flag”声明从方法移动到类体并将其标记为静态和 volatile

关于java - 线程重新运行run()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29497195/

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