我试图爆炸并破坏一个圆圈,但是在爆炸结束后圆圈的状态不会发生变化,这样它就会崩溃。我正在为这个圈子使用一个线程。如果我从面板类手动更改状态,我绘制我的圆组件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();
}
}
答案 0 :(得分:0)
如果state
被一个线程更改而另一个线程正在执行run
方法,则很可能这些更改不可见,因为state
未再次从内存中获取。将其volatile
再试一次。或者使用AtomicInteger
。