2012-08-25 177 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。)