线程重新运行run()方法

时间:2015-04-07 17:08:53

标签: java multithreading tortoisesvn

我正在学习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。:(请帮助我在这里发生的事情。

1 个答案:

答案 0 :(得分:1)

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