2011-08-22 107 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

是我在編輯中提到的嗎? –