访问正在线程run()方法内更新的数组

时间:2011-07-04 15:28:17

标签: java arrays multithreading timer

我有一个每5分钟更新一次数组的线程。

它工作正常但是在线程run()方法之外,似乎我无法访问此数组使其无用,我使用它的任何尝试我只是得到空指针异常。

我需要线程每5分钟更新一次数组,但我还需要从这个线程外部访问数组,最好的方法是什么?

由于

4 个答案:

答案 0 :(得分:0)

如果它只是一个你正在更新的数组,一旦构建它永远不会改变(包括数组的元素),你最好的选择是使数组引用volatile。也就是说,更新数组的线程会:

public volatile Object[] pubArray;

public void update() {
   Object[] newArray = new Object[...];
   //write to array
   //finally, AFTER THE ARRAY IS BUILT, write to the reference:
   this.pubArray = newArray;
}

答案 1 :(得分:0)

将数组声明为类的私有字段并正确实例化。


示例:

public class Controller implements Runnable {

private int[] array;

public Controller() {
    array = new int[10];
    for (int i = 1; i <= 10; i++) {
        array[i - 1] = i;
    }
}

public static void main(String[] args) {
    Controller controller = new Controller();
    Thread thread = new Thread(controller);
    thread.start();
    for (int i = 1; i < 5; i++) {
        controller.printArray();
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

private void printArray() {
    for (int i : array) {
        System.out.println(i);
    }
}

@Override
public void run() {
    for (int i = 1; i < 10; i++) {
        update(i);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

private void update(int incr) {
    for (int i = 0; i < array.length; i++) {
        array[i] = array[i] + incr;
    }
}

}

答案 2 :(得分:0)

如果您要获得NPE,则不会访问相同的参考。

您必须确保在两个线程中使用相同的引用,或者您没有共享同一个数组。

答案 3 :(得分:0)

如果您确实需要在其他位置访问线程时更新线程中的相同数组,则需要在更新或读取数组的方法上使用“synchronized”关键字。这将确保只有一个线程可以访问数据。这将有效地序列化对阵列的访问,并且不会扩展。所以只有你真的必须这样做才能做到。

您可以查看Java Concurrency in Practice