java - 同步线程以避免 ArrayIndexOutOfBoundsException

标签 java android multithreading

我有两个独立的线程:

  • 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);
        }
}}

syncronizedtrycatch 哪个是防止异常的正确方法? 使用一个比另一个有什么好处吗?

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/

相关文章:

具有六边形触摸边界的Android六边形按钮

c - 在这些条件下设置变量原子

java - 引用对象类型时使用final

java - 在 Jar 中打包和使用嵌入式数据库(H2.db 文件)?

android - Erron 在 Android 中使用 GoogleApiClient 获取最后已知位置

php - 在 PHP-MySQL 中基于子字符串检索行

python - 将信号从多个工作线程发送到 GUI 线程

c# - 确定所有线程何时完成 C#

java - 在两个后端系统之间安全地传递用户名和密码 endcrypted

java - Talend 直接从一个工作区复制到另一个