2011-07-04 2 views
0

У меня есть поток, который обновляет массив каждые 5 минут.Доступ к массиву, который обновляется внутри метода run() потоков

Он отлично работает, но вне метода run(), кажется, у меня нет доступа к этому массиву, что делает его бесполезным, любая попытка, которую я делаю для его использования, я просто получаю исключения из null-указателей.

Мне нужен поток для обновления массива каждые 5 минут, но мне также нужно иметь доступ к массиву из-за пределов этого потока, что это лучший способ сделать это?

Благодаря

+0

Можем ли мы увидеть код? – dlev

ответ

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

}

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

Если вы получаете NPE, вы не доступ к той же ссылке.

Вы должны убедиться, что используете одну и ту же ссылку в обоих потоках или не используете один и тот же массив.

0

Если вам необходимо обновить один и тот же массив в потоке, обратившись к нему в другом месте, вам нужно использовать ключевое слово 'synchronized' для методов, которые обновляют или читают массив. Это обеспечит доступ только к одному потоку данных. Это эффективно сериализует доступ к массиву и не будет масштабироваться. Так что сделайте это, только если вам действительно нужно.

Возможно, вам понравится Java Concurrency in Practice.

Смежные вопросы