java - 线程重新运行run()方法

标签 java multithreading tortoisesvn

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

相关文章:

Java - 超时长时间运行可调用线程

python - 当进程收到 SIGSTOP 和 SIGCONT 时如何处理超时?

svn - TortoiseSVN:显示先前版本中的文件?

svn - 除了标签之外,还有什么方法可以从 SVN 更新源吗?

visual-studio - 使用带有 Tortoise SVN 和 ankhSVN 插件的 VisualSVN 服务器用于 Visual Studio 2008

JavaFX 修改每列的 TableView 标题对齐方式

java - 将 doClick 放入 JOptionPane 中

java - Parcelable Object Android 中的数据覆盖

用于查找不以特定子字符串结尾的数字的 Java 模式正则表达式

multithreading - PerformSelector 单点触控线程