我正在学习多线程概念。我刚刚做了一个简单的 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/