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;
}

当然,重要的是数组的大小不是硬编码的常量,而是我可以在某个时候找到并插入的变量。

我希望你能从代码中看到我正在尝试做的事情,并且你知道如何让它工作。

谢谢!

4

3 回答 3

3

我想要全局变量,因为我让线程将文本文件中的数据读取到数组中,并且在线程完成工作后数组及其数据保持存在很重要。

好吧,那是行不通的。或者至少,它不会可靠地工作(从某种意义上说,这是一个更糟糕的结果!)

在多线程 Java 程序中,您需要确保线程在信息从一个传递到另一个的点处正确同步。同步的目的有两个:

  • 防止竞争条件;即一个线程在另一个线程读取值之前尝试读取它,并且
  • 确保线程不会因为内存缓存效应而看到过时的值副本。

同步裸全局变量将非常困难。我的建议是

  • 注意注释(上面)并使用类来封装状态设计和实现。

  • 使用实用程序类java.util.concurrent来实现共享数据结构......并处理线程创建/管理。以 ExecutorService API 为例,

  • 获得一本关于 Java 并发编程的好教科书。Java 中的并发并不简单,如果您不知道自己在做什么,您可以花费数小时/数天/数周/数月来追踪间歇性故障的原因。

于 2012-08-25T01:14:23.190 回答
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
    } 
}
于 2012-08-25T00:47:31.593 回答
1

我不提倡使用全局变量,但如果必须,您可以执行以下操作。一般来说:让每个线程建立自己的数据。完成工作后,将其数据添加到同步的全局集合(在本例中为 a 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.)

于 2012-08-25T01:19:11.653 回答