2011-08-22 105 views
6

我需要在我的Main类的main()方法中定义一个共享变量。我需要两个线程才能访问该共享变量。我通过实现Runnable接口并实现接口的抽象run()方法来创建线程。在我的类中定义的实现Runnable接口的run()方法内,我如何引用Main类的main()方法中定义的共享变量?显然,只是通过名称调用它们不起作用 - 因为它们看起来超出了我的Runnable类的范围。从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(); 

    } 


} 

所以我应该被创建一个对象到共享VAR存储在再在创建线程时将该对象传递给DoThread()构造函数?我有时在java通过ref传递或var传递之间感到困惑,所以如果我这样做,将通过t2看到由t1改变共享变量吗?

+0

你能发布你的代码吗? – SJuan76

+0

总是尝试发布[SSCCE](http://sscce.org/)。 –

回答

10

那么,如果你声明一个本地变量,你将无法引用该方法中创建的类以外的任何地方。

你在哪里执行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 
    } 
} 
+0

谢谢jon - 我在原帖中添加了一个例子^ –

+0

@Dave:我举了一个如何更改代码的例子。我仍然认为,如果在不同对象之间共享数据对于您来说是相对较新的,那么您可能还没有准备好迎接线程的额外困难。 –

7

代码会很有用。

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

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

您需要传递对共享值的引用。如果它不是一个引用已经你需要将它改为一个AtomicReference,AtomicInt等或你想分享的值的数组。

0

这是地方PassByRef更有效。将您的变量引用传递给两个可运行实例。那就是所有......从那里它可以在你的run方法中被引用。

例:

螺纹TH1 =新主题(Myrunnable(varRef))。同样对于其他线程

+0

是我在编辑中提到的吗? –