我有一个每5分钟更新一次数组的线程。
它工作正常但是在线程run()方法之外,似乎我无法访问此数组使其无用,我使用它的任何尝试我只是得到空指针异常。
我需要线程每5分钟更新一次数组,但我还需要从这个线程外部访问数组,最好的方法是什么?
由于
答案 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”关键字。这将确保只有一个线程可以访问数据。这将有效地序列化对阵列的访问,并且不会扩展。所以只有你真的必须这样做才能做到。