【发布时间】:2015-04-07 17:08:53
【问题描述】:
我正在学习多线程概念。我刚刚研究了一个简单的 POC,发现了一些奇怪的行为。请帮帮我
目标:- 运行 2 个线程,一个是“Tortoise”,另一个是“Hare”。让兔子睡 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 休眠 2 秒后,Tortoise 线程运行并将 flag 值设置为“true”,所以当野兔在 2 秒后出现,我的期望是 flag 将是真的,并且根本不会打印获胜者 sysout。但是该标志再次设置为“false”并为 Hare 运行获胜者系统输出。:(请帮助我这里发生了什么。
【问题讨论】:
-
flag是一个局部变量。 -
ThreadLearn 有两个实例,每个实例都有一个包含局部变量'flag'的运行方法。在一个位置(例如在 Tortoise 中)设置变量“flag”的值不会影响另一个位置(Hare)。
标签: java multithreading tortoisesvn