[英]How to avoid NullPointerException in ArrayList with 2 threads
我正在創建一個Android游戲,我遇到了一個問題。 我有2個線程:OpenGL線程和游戲循環。 我使用ArrayLists來存儲我的可渲染對象,這就是問題所在。 有時我需要在游戲線程中刪除這些對象,有時它會導致OpenGL線程獲得NullPointerException,因為據我所知,它會通過集合並突然刪除一個元素。 我想我應該讓OpenGL線程刪除對象但是還有其他任何解決方案,如果游戲循環將開始獲取null元素怎么辦? 也許我可以以某種方式制作同步線程但我仍然不明白“同步”是如何工作的。 謝謝。
這會有幫助嗎? 我應該把它放在我用ArrayList做某事的地方嗎?
synchronized (arrayListName)
{
arrayListName.remove(object);
}
我仍然不明白“同步”是如何工作的
這是你需要補救的東西。 java中的並發結構(包括synchronized
是基本概念。 我建議選擇Effective Java, 2nd ed.
http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
一個基本的想法是,如果你有一個原子操作,其中一個線程讀取列表項,然后另一個線程讀取列表項,你需要用二進制信號量鎖定 - 最簡單的方法是使用java synchronized構造。
一個不太天真的方法可能是讓線程1從列表中提取值,執行它需要做的事情,然后將值“傳遞”給線程2,例如,通過將項添加到線程2擁有的隊列中。
如果不熟悉代碼,幾乎不可能為您的應用程序描述“正確”的解決方案。 我只是瘋狂猜測。
傑弗瑞的回答是正確的,但總結一下這本書的內容:
“只要需要,就使用java.util.concurrent
。” (復述)
基本上,不要重新創建輪子。 java.util.concurrent
包是一個非常優化的線程安全類的集合,如ConcurrentHashMap
看看這個相關的StackOverflow問題:
進一步閱讀:
http://www.ibm.com/developerworks/java/library/j-5things4/index.html
http://developer.android.com/reference/java/util/concurrent/package-summary.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.