Java 为什么我的applet';s的绘制方法抛出ConcurrentModificationException

Java 为什么我的applet';s的绘制方法抛出ConcurrentModificationException,java,concurrency,applet,awt,Java,Concurrency,Applet,Awt,这是我的小程序类: package DavidPackages.Prototypes.Samples.BubblesV2SSCCE; import java.applet.Applet; import java.awt.*; import java.awt.geom.Ellipse2D; import java.util.ArrayList; import java.util.Random; public class BubbleAppletV2SSCCE extends Applet im

这是我的小程序类:

package DavidPackages.Prototypes.Samples.BubblesV2SSCCE;

import java.applet.Applet;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.Random;

public class BubbleAppletV2SSCCE extends Applet implements Runnable{

    private Thread thread;
    private ArrayList<Ellipse2D> circles;

    public void init(){
        //Initialize bubbles with one entry so that we have a bubble to start out with
        Random r = new Random();
        circles = new ArrayList<Ellipse2D>();
        circles.add(new Ellipse2D.Float(5, 5, 15, 15));

        thread = new Thread(this);
        thread.start();
    }

    public void run(){
        while(true){

            update();
            repaint();

            try{
                Thread.sleep(10);
            }catch(InterruptedException ie){
                ie.printStackTrace();
            }
        }
    }

    private void update(){
        circles.add(new Ellipse2D.Float(5, 5, 15, 15));
    }

    public void paint(Graphics graphics){
        for(Ellipse2D circle : circles){
           ((Graphics2D) graphics).draw(circle);
        }
    }

    public void stop(){}
}
我的代码中唯一的调用是:

    at DavidPackages.Prototypes.Samples.BubblesV2SSCCE.BubbleAppletV2SSCCE.paint(BubbleAppletV2SSCCE.java:43) 
这是哪一行:

        for(Ellipse2D circle : circles){
更多详情:

  • 我在IntelliJ IDEA 10.5.4中运行这个
  • 我在运行OSX 10.5.8的Mac上运行这个
  • 当气泡中有更多气泡实例时,更可能引发异常
  • 当小程序的多个实例正在运行时,更可能引发异常
我很困惑,因为我看不出在控件处于for循环时如何修改气泡的内容

有人有什么想法吗

奖金问题:

  • 我的意图是最终创建一个在某人的机器上运行的游戏,而不是在web浏览器中运行。除了小程序之外,我应该使用什么
  • 我应该用什么来代替AWT
关于上面的第二个奖金问题。我发现上面写着:

AWT提供了丰富的图形环境,特别是在JavaV1.2及更高版本中。通过Graphics2D对象、Java2D和Java3D服务,可以创建许多功能强大的图形应用程序,如绘图和图表软件包,以及与JavaSound相结合的竞争性交互式游戏

这让我相信AWT确实适合我。还是作者错了?这篇文章是2006年的,所以有点过时,但不多

更新(原始帖子中没有的内容):

  • 删除了一长段注释掉的代码
  • 更新了我的示例
  • 增加了额外的问题
  • 添加了比较AWT、Swing和SWT的文章中的引用

您没有在paint方法中更改气泡的内容,而是在run方法中更改气泡的内容,并且该方法在单独的线程中执行。这就解释了为什么不总是会出现这种异常,只有当在另一个线程中更改列表气泡的同时执行绘制时才会发生这种异常。

您不是在绘制方法中更改气泡的内容,而是在运行方法中更改气泡的内容,该方法在单独的线程中执行。这就解释了为什么不总是会出现这种异常,只有在另一个线程中更改列表气泡的同时执行绘制时才会发生这种异常。

我不太清楚pain()和run()是如何不同的线程。我的印象是:(1)因为我的applet实现了runnable,我用它创建了一个线程,它所做的一切都是同一个线程;(2)run()调用repaint(),堆栈下调用paint(),所有这些都是同一个线程。这不对吗?此外,如果问题是你所说的,我该如何解决它?@David我不是小程序方面的专家,但正在阅读:底层软件通过调用小程序从小程序类继承的方法来控制小程序。因此,我认为paint方法不仅仅是从run方法调用的。您可以看到BubbleAppletV2的run方法不在堆栈跟踪中。为了解决这个问题,你应该同步它们谢谢你的回答,我已经在我的问题中添加了一些问题。你能看一下吗?我不太明白pain()和run()是如何不同的线程。我的印象是:(1)因为我的applet实现了runnable,我用它创建了一个线程,它所做的一切都是同一个线程;(2)run()调用repaint(),堆栈下调用paint(),所有这些都是同一个线程。这不对吗?此外,如果问题是你所说的,我该如何解决它?@David我不是小程序方面的专家,但正在阅读:底层软件通过调用小程序从小程序类继承的方法来控制小程序。因此,我认为paint方法不仅仅是从run方法调用的。您可以看到BubbleAppletV2的run方法不在堆栈跟踪中。为了解决这个问题,你应该同步它们谢谢你的回答,我已经在我的问题中添加了一些问题。你能看一下吗?1)要想更快地得到更好的帮助,请发一封邮件。并且省去了注释代码的大量部分。2) 为什么要在这个千年中使用AWT组件?3) 为什么在网页中使用小程序而不是自由浮动的框架?4) 不要覆盖
update()
(从
组件
)使用不同的方法名称。5) 看起来
while(true)
循环是错误的-当我看到一个SSCCE.Ah时,会看到更多细节。是的。我本想删除那一大块注释,但当我试图将所有内容都作为代码呈现时,它一定找到了自己的方法。我将在SSCCE上工作。同时:@2)因为我不知道自己在做什么,你有什么建议@3) 我要的是自由浮动的框架实际上,我用什么来做呢?Jframes?谢谢你的好评论。我总是确信有更好的东西我不知道,但我在Swing方面运气很好。AWT和Swing在游戏中并不是那么分开的;我总是从AWT开始,保持它的简单性,发现我需要很多挥杆的东西,然后把它扔进去。我总是使用JFrame。(哎呀,Swing已经开始了。)1)要更快地获得更好的帮助,请发布一个。并且省去了注释代码的大量部分。2) 为什么要在这个千年中使用AWT组件?3) 为什么在网页中使用小程序而不是自由浮动的框架?4) 不要覆盖
update()
(从
组件
)使用不同的方法名称。5) 看起来
while(true)
循环是错误的-当我看到一个SSCCE.Ah时,会看到更多细节。是的。我本想删除那一大块注释,但当我试图将所有内容都作为代码呈现时,它一定找到了自己的方法。我将在SSCCE上工作。同时:@2)因为我不知道自己在做什么,你有什么建议@3) 我要的是自由浮动的框架实际上,我用什么来做呢?Jframes?谢谢你的帮助
        for(Ellipse2D circle : circles){