2012-08-25 131 views
0

我想要做的是有一個全局變量類和函數可以讀/寫/從。從全局變量讀取和寫入

我現在已經是

import java.lang.*;    
import lab1.Global; 
public class SecondProgram { 
    public static void main (String args[]) { 
      System.out.println("hi "); 
      Global.b[0] = " zero "; 
      Global.b[1] = " One "; 
      Global.b[2] = " Two "; 
      Global.b[3] = " Three "; 

     } 
} 

和我創建了一個類來存儲全局變量

public class Global { 
    public static String a = "hi" ; 
    public static String [] b; 
} 

當然是很重要的是,數組的大小不是一個硬編碼的常數但一個變量,我將能夠發現在某個時間點,並插入。

我希望你能從代碼中看到我想要做什麼,並且你知道如何使它工作。

謝謝!

+1

有什麼問題? – MaVRoSCy

+4

爲什麼你想*全局變量? – oldrinb

+0

如果您擔心數組的大小,請使用列表? –

回答

1

我認爲這是一個更好的辦法,有什麼東西讓你開始....

import java.util.ArrayList; 

public class SecondProgram { 

    private static ArrayList <String>file = new ArrayList(); 

    public synchronized boolean writeFile(String str){ 
     //wrtite file to your list 
     file.add(str); 
     return true; 
    } 
    public static void main(String args[]) { 
     //read file and use the synchronized method to write it to your list 
    } 
} 
3

我想全局變量,因爲我有線程讀取文本文件中的數據到陣列,它的重要的是數組及其數據在線程完成其工作後保持存在。

那麼這是行不通的。或者至少,它不會工作可靠(在一定意義上是一個糟糕的結果!)

在多線程Java程序,你需要確保線程在點正確地同步將信息從一個傳遞到另一個。同步的目的有兩個:

  • 以防止競爭條件;即一個線程在另一個線程讀取數據之前試圖讀取一個值,並且
  • 確保線程看不到陳舊由於內存高速緩存效應產生的值的副本。

同步裸露的全局變量將會非常困難。我的建議是

  • 注意上面的註釋並設計和實現使用類來封裝狀態。

  • 使用實用工具類中java.util.concurrent實現共享數據結構......和處理線程創建/管理。看看ExecutorService的API例如,

  • 獲取有關在Java中併發編程的好教材。 Java中的併發並不簡單,如果您不知道自己在做什麼,則可以花費幾小時/幾天/幾周/幾個月來追蹤間歇性故障的原因。

1

我不主張用全局的,但如果你一定要,你可以不喜歡以下。一般來說:讓每個線程建立自己的數據。完成其工作後,將其數據添加到同步的全局集合中(本例中爲List<List<String>>)。然後在所有線程完成工作後再讀取該收集。

全球收集的數據:

public class GlobalDataBroker { 
    public static List<List<String>> data = Collections.synchronizedList(new LinkedList<List<String>>()); 
} 

的範例:

public static void main(String[] args) throws InterruptedException { 
    for (int i=0; i < 10; i++) { 
     new Thread(new Runnable(){ 
      @Override 
      public void run() { 
       List<String> list = new LinkedList<String>(); 
       list.add(String.format("I'm a Thread and my name is %s.",Thread.currentThread())); 
       for (int i = 0; i < 5; i++) { 
        list.add("Data!"); 
       } 
       GlobalDataBroker.data.add(list); 
      } 
     }).start(); 
    } 

    // When the threads are done ...    
    Iterator<List<String>> i = GlobalDataBroker.data.iterator(); 
    while (i.hasNext()) { 
     System.out.println(i.next()); 
    } 
} 

輸出:

[I'm a Thread and my name is Thread[Thread-8,5,main]., Data!, Data!, Data!, Data!, Data!] 
[I'm a Thread and my name is Thread[Thread-5,5,main]., Data!, Data!, Data!, Data!, Data!] 
... 
[I'm a Thread and my name is Thread[Thread-7,5,main]., Data!, Data!, Data!, Data!, Data!] 

請注意,你只應該開始遍歷數據,一旦你已經完成了寫作。 (否則,您可能會遇到可怕的ConcurrentModificationException。)