Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在实现runnable的两个子类之间共享变量_Java_Multithreading - Fatal编程技术网

Java 如何在实现runnable的两个子类之间共享变量

Java 如何在实现runnable的两个子类之间共享变量,java,multithreading,Java,Multithreading,我有一个主类和两个子类,子类1和子类2实现了runnable 我同时运行了两个线程 打电话 t1.start//t1用于子类1 t2.start//t2子类2 现在,我希望t1运行到t2完成 我可以在子类2中的方法中添加一个布尔标志,以识别执行已经完成; 现在我需要将该信息(布尔变量)传递给子类1,以停止其中一组代码的执行。[已使用while(true)循环;] 那么我如何创建一个可以被两个子类访问的公共变量呢 有人能为我推荐一个解决方案吗?如果可能的话,我建议避免在并发环境中共享可变状态,但假

我有一个主类和两个子类,子类1和子类2实现了runnable

我同时运行了两个线程

打电话

t1.start//t1用于子类1

t2.start//t2子类2

现在,我希望t1运行到t2完成

我可以在子类2中的方法中添加一个布尔标志,以识别执行已经完成; 现在我需要将该信息(布尔变量)传递给子类1,以停止其中一组代码的执行。[已使用while(true)循环;]

那么我如何创建一个可以被两个子类访问的公共变量呢


有人能为我推荐一个解决方案吗?

如果可能的话,我建议避免在并发环境中共享可变状态,但假设您遇到无法避免的情况,您可以尝试以下方法(根据您自己的需要进行调整):


基本上,在外部创建
SharedState
并在创建时注入子类(或者在其中一个子类中创建它,检索并注入另一个子类,等等)。然后使用该共享变量,记住您所知道的共享状态的种种诡计。

如果可能的话,我建议避免在并发环境中共享可变状态,但假设您遇到无法避免的情况,您可以尝试以下方法(根据您自己的需要进行调整):


基本上,在外部创建
SharedState
并在创建时注入子类(或者在其中一个子类中创建它,检索并注入另一个子类,等等)。然后使用该共享变量,记住您所知道的关于共享状态的种种诡计。

将一个
原子布尔值传递给子类

public class SubClass1 implements Runnable {
    private AtomicBoolean b;
    public SubClass1(AtomicBoolean b) {
        this.b = b;
    }

    public void run() {
        while(b.get()) {  // Assuming SubClass2 sets it to false when it's no longer running
            // Do something
        }
    }
}

实现
子类2
作为练习留给
OP

向子类传递
AtomicBoolean

public class SubClass1 implements Runnable {
    private AtomicBoolean b;
    public SubClass1(AtomicBoolean b) {
        this.b = b;
    }

    public void run() {
        while(b.get()) {  // Assuming SubClass2 sets it to false when it's no longer running
            // Do something
        }
    }
}

实现
子类2
作为练习留给
OP

展示一些代码来解释发生了什么。子类1和子类2是主类的内部类吗?您总是可以将相同的引用传递给这两个子类。问题是由您的措辞引起的。您不希望在类之间共享变量,但希望在两个实例之间共享对象。解决方法很简单:构造共享对象。将共享对象传递给可运行实现的构造函数。显示一些代码来解释发生了什么。子类1和子类2是主类的内部类吗?您总是可以将相同的引用传递给这两个子类。问题是由您的措辞引起的。您不希望在类之间共享变量,但希望在两个实例之间共享对象。解决方法很简单:构造共享对象。将共享对象传递给可运行实现的构造函数。感谢您的响应:)感谢您的回复:)一个问题通常有一个简单的解决方案。