0

我正在尝试爆炸和内爆一个圆圈,但爆炸结束后圆圈的状态不会改变,因此它可以内爆。我正在为这个圈子使用一个线程。如果我从绘制圆形组件的面板类中手动更改状态,则 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; }

这是该类的运行方法:

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();
        }
}
4

1 回答 1

0

如果state在另一个线程执行该run方法时被一个线程更改,则很有可能这些更改不可见,因为state不会再次从内存中获取。让它volatile再试一次。或使用AtomicInteger.

于 2013-04-15T20:49:32.993 回答