0

Android ゲームを作成していて、問題が発生しました。OpenGLスレッドとゲームループの2つのスレッドがあります。レンダリング可能なオブジェクトを格納するために ArrayLists を使用していますが、ここに問題があります。ゲームスレッドでこれらのオブジェクトを削除する必要がある場合があり、OpenGL スレッドが NullPointerException を取得することがあります。これは、私が理解しているように、コレクションを通過して突然要素が削除されるためです。OpenGL スレッドにオブジェクトを削除させるべきだと思いますが、他の解決策はありますか?また、ゲーム ループが null 要素を取得し始めた場合はどうなりますか? 「同期」がどのように機能するかはまだわかりませんが、どうにかしてスレッドを同期させることができるかもしれません。ありがとう。

これは役に立ちますか?そして、ArrayList を使って何かをする場所ならどこにでも配置する必要がありますか?

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

2 に答える 2

2

「同期」がどのように機能するのかまだわかりません

それはあなたが修正する必要があるものです。を含む Java 内の同時実行構造synchronizedは、基本的な概念です。選ぶことをお勧めしますEffective Java, 2nd ed.

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

基本的な考え方の 1 つは、1 つのスレッドがリスト項目を読み取り、次に別のスレッドがリスト項目を読み取るアトミック操作がある場合、それをバイナリ セマフォでロックする必要があるということです。最も簡単な方法は、Java 同期構造を使用することです。 .

単純ではないアプローチとして、スレッド 1 にリストから値を取得させ、必要な処理を実行させてから、スレッド 2 が所有するキューに項目を追加するなどして、値をスレッド 2 に「渡す」という方法があります。

アプリケーションの「正しい」ソリューションを説明することは、コードをよく知らなければほとんど不可能です。私は勝手な推測をしているだけです。

于 2012-03-28T13:54:16.837 に答える
0

ジェフリーの答えは正しいですが、本が言うことを要約すると:

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

于 2012-09-11T06:01:46.180 に答える