Dav*_*son 6 java multithreading shared-memory
我需要在Main类的main()方法中定义一个共享变量.我需要两个线程才能访问该共享变量.我通过实现Runnable接口并实现接口的抽象run()方法来创建线程.如何在我的类中定义的实现Runnable接口的run()方法中引用Main类的main()方法中定义的共享变量?显然,只是按名称调用它们是行不通的 - 因为它们出现在我的Runnable类的范围之外.
编辑 - 道歉,这是一个简单的例子
public Class DoThread implements Runnable {
public void run(){
sharedVar += 1
}
}
Run Code Online (Sandbox Code Playgroud)
并在一个单独的.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();
}
}
Run Code Online (Sandbox Code Playgroud)
那么我应该创建一个对象来存储共享var,然后在创建线程时将该对象传递给两个DoThread()构造函数?有时在java通过ref或传递var之间会感到困惑,所以如果我这样做,t2会看到t1对共享变量的影响吗?
Jon*_*eet 11
好吧,如果你声明一个局部变量,除了在该方法中创建的类之外,你将无法引用它.
你在哪里实施Runnable?如果它在同一个类中,那么你可以使它成为一个实例变量,并main在你创建线程的同一个实例上设置变量,或者使它成为一个静态变量.如果Runnable在不同的类中实现,那么当你构造该类的实例时,你可以给它所需的数据 - 目前还不清楚这意味着什么......正如其他人所说的那样,代码会很有用.(例如,线程是否需要能够看到原始数据的变化?)
另外,线程相对较高,而在类之间传播数据则相对基础.如果您是Java新手,我建议您开始使用比线程更容易的东西.
编辑:对于您的示例,您应该使用AtomicInteger,如下所示:
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
}
}
Run Code Online (Sandbox Code Playgroud)
代码很有用.
如果您使用的是匿名类,则可以将变量声明为,final并且可以在匿名类中访问它们.
public void main(String[] args) {
final int myvar = 0;
new Thread(new Runnable() {
public void run() {
System.out.println("myvar: "+myvar);
}
}).start();
}
Run Code Online (Sandbox Code Playgroud)