我有两个独立的线程:
- logicThread - 用于 ai、运动、 Sprite 排序和 Sprite 销毁
- drawingThread - 用于绘图 (canvas.draw())
我的逻辑线程调用 ArrayList.remove(),所以我认为当绘制线程开始绘制时,可能会崩溃,因为索引不再存在。
代码示例:
drawingThread extends Thread {
logicThread = new LogicThread;
logicThread.start();
public void run(){
while(running) {
for(int i=0; i<npc.size(); i++){
npc.get(i).callDraw();
}
}
// stop logicThread when out of gameloop
logicThread.running = false;
}}
LogicThread extends Thread {
public void run(){
while(running){
for(int i=0; i<npc.size();i++){
if(npc.get(i).isDead()){
npc.remove(i);
}
npc.trimToSize();
}
Collection.sort(npc);
}
}}
syncronized 或 trycatch 哪个是防止异常的正确方法? 使用一个比另一个有什么好处吗?
synchronized(logicThread) {
for(int i=0; npc.size(); i++) {
npc.callDraw();
}}
或
try {
npc.callDraw();
} catch(Exception e) {}
最佳答案
注意事项:使用迭代器从集合中删除项目:
while (it.hasNex()) {
if(...) {
it.remove();
如果可以接受,捕获 IndexOutOfBound 异常是有效的。另一种方法是在绘图线程中创建数组副本,这将保证您不会获得 IndexOutOfBound。您可以在绘图循环中添加一个检查 isDead()
关于java - 同步线程以避免 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7887475/