【问题标题】:Thread re-runs the run() method线程重新运行 run() 方法
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 其实flags并不是独立的,因为有2个实例。即使只有一个实例,也会有两个独立的标志。如果使用单个实例,则该字段不需要是静态的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2011-03-03
  • 1970-01-01
  • 2014-05-06
  • 2018-10-17
  • 2015-03-12
  • 2014-01-09
相关资源
最近更新 更多