我正在学习MultiThreading概念。我只是在一个简单的POC上工作,发现了一些奇怪的行为。请帮助我
目标: - 要运行2个主题,一个是“Tortoise”,另一个是“Hare”。让野兔睡觉2秒,只允许乌龟在野兔之前完成线程。
My Runnable Class
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睡眠2秒后,Tortoise线程运行并将标志值设置为“true”,所以当兔子在2秒后出现,我的期望是旗帜将是真的,Winner sysout根本不会被打印出来。但是这个标志再次被设置为“假”并为野兔运行Winner sysout。:(请帮助我在这里发生的事情。
答案 0 :(得分:1)
每个线程都有自己的“标志”,因为您创建了2个ThreadLearn实例。两面旗帜都是独立的。如果你需要分享'flag'=>你必须将'flag'声明从方法移动到类体并将其标记为静态和易失性