有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通过其类的两个实例使用扩展线程导致值跳过

我有下一个我正在尝试运行的示例,但有时它运行良好,另一个示例没有退出循环。我只能想象,由于某些原因,值正在跳过。 通过跳过这些值,我指的是用来通知类闪光器中的循环退出的标志,这些标志是从类引擎中带出来的,也指用来通知类闪光器中的循环的标志。 这就是我如何理解它可以以尽可能最好、最简单的方式运行的原因,但到底发生了什么? 你能帮忙吗

//Main class:
    public class Flasher {
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) 
        {
            engine en1 = new engine("ZaikoBaiko");
            engine en2 = new engine("MiliVaninili");
            en1.start();
            en2.start();
            int Terminator2 = 0;
            while(!en1.Terminator||!en2.Terminator)
            {
            }
            System.out.println(" owns the last word");
            en1.roboCop = true;
            en2.roboCop = true;
        }
        
    }

//Thread Class:

public class engine extends Thread
{   
    public String OB;
    public boolean Terminator = true;
    public boolean roboCop = false;
    private Thread t;
    engine(String name)
    {
       OB = name;
       Terminator = false;
    }
    
    @Override
    public void run()
    {
        int x = 0;
        while(x<100)
        {
            System.out.println(x+":"+OB);
        x++;
        }
        Terminator = true;
        while(!roboCop){}
    }
    
    @Override
    public void start()
    {
        if(t==null)
        {
            t = new Thread(this,OB);
            t.start();
        }
        
    }
}

共 (1) 个答案

  1. # 1 楼答案

    JVM正在缓存您的变量。您需要将volatile添加到检查变量中(Terminator、roboCop)。这将确保所有线程向主内存写入/读取最新值

    这里的详细解释是similar question