簡體   English   中英

如何避免在ArrayList中使用2個線程的NullPointerException

[英]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問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM