2012-03-13 177 views
-2

我有一個循環,這樣做:如何在java中的兩個線程之間共享變量?

  WorkTask wt = new WorkTask(); 
      wt.count = count; 
      Thread a = new Thread(wt); 
      a.start(); 

當workTask運行時,計數將與wt ++, 但WorkTask似乎並不改變計數,而線程之間,變量可以」在兩個線程內共享,我寫錯了什麼?謝謝。

回答

2

沒有看到WorkThread的代碼很難確定問題,但很可能是因爲缺少兩個線程之間的同步。

無論何時啓動線程,都無法保證原始線程或新創建的線程是先運行還是如何計劃。 JVM /操作系統可以選擇運行原始線程到完成,然後開始運行新創建的線程,運行新創建的線程完成,然後切換回原始線程或其他任何中間的任何線程。

爲了控制線程的運行方式,您必須明確地同步它們。有幾種方法可以控制線程之間的交互 ​​- 當然在單個答案中描述太多了。我會推薦使用Java教程的the concurrency trail進行廣泛的概述,但在具體情況下,啓動的同步機制可能是Thread.join和synchronized關鍵字(在the Java tutorials中描述了此關鍵字的一個特定用途)。

1

使得計數爲靜態變量(它看起來像每個線程都有自己的變量版本現在),並使用一個互斥體,使其線程安全的(即使用同步指令)

0

如果您希望從一個線程得到一個結果,我會建議你使用Callable 接口和一個ExecutorSercive來提交它。例如:

Future future = Executors.newCachedThreadPool().submit 
    (new Callable<Interger>() 
    { 
     int count = 1000; 

     @Override public Integer call() throws Exception 
     { 
      //here goes the operations you want to be executed concurrently. 
      return count + 1; //Or whatever the result is. 
     } 
    } 

    //Here goes the operations you need before the other thread is done. 

    System.out.println(future.get()); //Here you will retrieve the result from 
    //the other thread. if the result is not ready yet, the main thread 
    //(current thread) will wait for it to finish. 

這樣你就不必處理同步問題等 你可以在Java單證進一步看一下:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html

1

從你的描述我來與以下內容展示我認爲你的問題。此代碼,應該輸出42.但它輸出41

public class Test { 
static class WorkTask implements Runnable { 
    static int count; 
    @Override 
    public void run() { 
     count++; 
    } 
} 
public static void main(String... args) throws Exception { 
    WorkTask wt = new WorkTask(); 
    wt.count = 41; 
    Thread a = new Thread(wt); 
    a.start(); 
    System.out.println(wt.count); 
} 
} 

的問題是由於之前運行的線程有機會開始打印語句。

要使當前線程(即將讀取變量計數的線程)等待線程完成,請在啓動thre線程後添加以下內容。

a.join(); 
相關問題