Как избежать исключения NullPointerException в ArrayList с двумя потоками - PullRequest
0 голосов
/ 28 марта 2012

Я создаю игру для Android и столкнулся с проблемой.У меня есть 2 потока: поток OpenGL и цикл игры.Я использую ArrayLists для хранения моих объектов визуализации и вот в чем проблема.Иногда мне нужно удалить эти объекты в игровом потоке, а иногда это приводит к тому, что поток OpenGL получает исключение NullPointerException, потому что, как я понимаю, он проходит через коллекцию и внезапно элемент удаляется.Я думаю, что я должен позволить потоку OpenGL удалять объекты, но есть ли другое решение, и что если игровой цикл начнет получать нулевые элементы?Может быть, я могу каким-то образом заставить синхронизировать потоки, хотя я до сих пор не понимаю, как работает «синхронизированный».Спасибо.

Поможет ли это?И должен ли я это делать везде, где я что-то делаю с моим ArrayList?

synchronized (arrayListName) 
{ 
    arrayListName.remove(object); 
}

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Я до сих пор не понимаю, как работает "синхронизированный"

это то, что вам нужно будет исправить. конструкции параллелизма внутри Java, включающие synchronized, являются фундаментальными понятиями. я бы порекомендовал выбрать Effective Java, 2nd ed.

http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683

Одна из основных идей заключается в том, что если у вас есть атомарная операция, в которой один поток читает элемент списка, а другой поток читает элемент списка, вам необходимо заблокировать его двоичным семафором - самый простой способ - использовать Java синхронизированная конструкция.

менее наивный подход может заключаться в том, чтобы один поток извлекал значение из списка, делал то, что ему нужно, а затем "передавал" значение потоку 2, например, добавляя элемент в очередь, принадлежащую потоку. 2.

Описание «правильного» решения для вашего приложения практически невозможно без глубокого знания кода. я просто делаю дикие догадки.

0 голосов
/ 11 сентября 2012

Ответ Джеффри верный, но в итоге, что книга скажет:

"Используйте java.util.concurrent всякий раз, когда это необходимо." (Перефразируя)

По сути, не создавайте заново колесо. Пакет java.util.concurrent представляет собой набор очень хорошо оптимизированных потоковобезопасных классов, таких как ConcurrentHashMap

Посмотрите на этот связанный вопрос StackOverflow:

https://stackoverflow.com/questions/10395903/why-is-there-not-concurrent-arraylist-in-java-util-concurrent-package

Дальнейшее чтение:

http://www.ibm.com/developerworks/java/library/j-5things4/index.html

http://developer.android.com/reference/java/util/concurrent/package-summary.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...