Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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 从可运行类内部访问共享变量_Java_Multithreading_Shared Memory - Fatal编程技术网

Java 从可运行类内部访问共享变量

Java 从可运行类内部访问共享变量,java,multithreading,shared-memory,Java,Multithreading,Shared Memory,我需要在我的主类的Main()方法中定义一个共享变量。我需要两个线程才能访问该共享变量。我通过实现Runnable接口和接口的抽象run()方法来创建线程。如何从实现Runnable接口的类中定义的run()方法中引用Main类的Main()方法中定义的共享变量?显然,仅仅按名称调用它们是行不通的——因为它们似乎超出了我的Runnable类的范围 编辑-抱歉,这里是一个简单的例子 public Class DoThread implements Runnable { public vo

我需要在我的主类的Main()方法中定义一个共享变量。我需要两个线程才能访问该共享变量。我通过实现Runnable接口和接口的抽象run()方法来创建线程。如何从实现Runnable接口的类中定义的run()方法中引用Main类的Main()方法中定义的共享变量?显然,仅仅按名称调用它们是行不通的——因为它们似乎超出了我的Runnable类的范围

编辑-抱歉,这里是一个简单的例子

public Class DoThread implements Runnable {

    public void run(){
        sharedVar += 1
    }


}
并在单独的.class文件中:

public Class Main {

    public static void main(String[] args) {
        int sharedVar = 0;

        Thread t1 = new Thread(new DoThread());
        Thread t2 = new Thread(new DoThread());

        t1.start();
        t2.start();

        t1.join();
        t2.join();

    }


}
那么,我应该创建一个对象来存储共享变量,然后在创建线程时将该对象传递给两个DoThread()构造函数吗?有时我会混淆java是按ref传递还是按var传递,所以如果我这样做,t2会看到t1对共享var的更改吗?

代码会很有用

如果您使用的是匿名类,那么您可以将变量声明为
final
,并且可以在匿名类中访问它们

public void main(String[] args) {
    final int myvar = 0;
    new Thread(new Runnable() {
        public void run() {
            System.out.println("myvar: "+myvar);
        }
    }).start();
}

您需要传递对共享值的引用。如果它不是引用,则需要将其更改为AtomicReference、AtomicInt等或要共享的值数组。

好吧,如果声明局部变量,则除了在该方法中创建的类中之外,您将无法在任何地方引用它

您在哪里实现
Runnable
?如果它在同一个类中,则可以将其设置为实例变量,并在创建线程的同一实例上设置变量,或者将其设置为静态变量。如果
Runnable
是在另一个类中实现的,那么当您构造该类的实例时,您可以为它提供所需的数据-目前还不清楚这到底意味着什么。。。正如其他人所说,代码将是有用的。(例如,线程是否需要能够看到原始数据中的更改?)

另一方面,线程是相对高级的,而在类之间传播数据是相对基本的。如果您是Java新手,我建议您开始做比线程更简单的事情

编辑:对于您的示例,您应该使用,如下所示:

import java.util.concurrent.atomic.AtomicInteger;

class DoThread implements Runnable {

    private final AtomicInteger counter;

    DoThread(AtomicInteger counter) {
        this.counter = counter;
    }

    public void run() {
        counter.incrementAndGet();
    }
}

public class Test {
    public static void main(String[] args) throws InterruptedException {
        AtomicInteger shared = new AtomicInteger(0);

        Thread t1 = new Thread(new DoThread(shared));
        Thread t2 = new Thread(new DoThread(shared));

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println(shared.get()); // Prints 2
    }
}

这是PassByRef更有效的地方。将变量引用传递给两个可运行实例。就这些。。。从那时起,可以在run方法中引用它

例:


线程th1=新线程(Myrunnable(varRef))。类似地,对于其他线程

始终尝试发布一条消息。@Dave:我已经给出了一个示例,说明了如何更改代码。我仍然认为,如果在不同对象之间共享数据对您来说相对较新,那么您可能还没有准备好应对线程化带来的额外困难。