圆的状态参数在线程类中没有变化

时间:2013-04-15 20:13:23

标签: java multithreading java-2d

我试图爆炸并破坏一个圆圈,但是在爆炸结束后圆圈的状态不会发生变化,这样它就会崩溃。我正在为这个圈子使用一个线程。如果我从面板类手动更改状态,我绘制我的圆组件2个方法(爆炸和内爆)工作。如何在从圆圈类完成爆炸后将状态更改为内爆?

这是爆炸方法:

public void explode()
    {
        double xCenter=thisBall.x+15;
        double yCenter=thisBall.y+15;

        if( (thisBall.x>xCenter-40) &&(thisBall.y>yCenter-40)&&(size<80))
        {
            thisBall.x--;
            thisBall.y--;
            size+=2;
            thisBall.setFrame(thisBall.x,thisBall.y,size,size);
        }
        else {state=2;}

    }

这是内爆方法:

public void implode()
    {
        double xCenter=thisBall.x+40;
        double yCenter=thisBall.y+40;

        if((thisBall.x<xCenter) &&(thisBall.y<yCenter)&&(size>0))
        {
            thisBall.x++;
            thisBall.y++;
            size-=2;
            thisBall.setFrame(thisBall.x,thisBall.y,size+1,size+1);
        }
        else{state=3; }

这是该类的run方法:

public void run()
    { while(state==1)
        {
            try {
                   Thread.sleep(40); 
                }
                catch (InterruptedException e)
                {  System.out.println("Thread Halted");}
            explode();

            controller.repaint(); // this is the panel where i draw the circle
        }
                while(state==2){
            try {
                   Thread.sleep(40); 
                }
                catch (InterruptedException e)
                {  System.out.println("Thread Halted");}
            implode();
            controller.repaint();
        }
}

1 个答案:

答案 0 :(得分:0)

如果state被一个线程更改而另一个线程正在执行run方法,则很可能这些更改不可见,因为state未再次从内存中获取。将其volatile再试一次。或者使用AtomicInteger