我想做两个线程,一个线程是发出警报,一个线程解除警报,想通过两个线程修改同一个布尔变量来实现.
但问题是:我在一个线程内修改完之后,另一个线程使用的值还是以前的值,也就是"alarm"会一直打印下去,不会停止.如何解决,谢谢!!!代码://利用两个线程更改一个标识变量来实现,AlarmSoundPlay是一个单例
final class AlarmSoundPlay{
 private static AlarmSoundPlay s = null;
 private AlarmSoundPlay() {  }        
 
 private  volatile boolean  alarmFalg=false;   //##############标识变量
 
  public void setAlarm()     //设置警报
  {  this.alarmFalg =true; }      public void freeAlarm()  //解除警报
  {  this.alarmFalg=false;  }
  
  public void playAlarm()  //发出警报
  {   
  while(alarmFalg)   //如果标识变量有效,会每隔1000毫秒打印"alarm"
  {  
        System.out.println("alarm");
    Thread.sleep(1000);
  }   }
  
  public static AlarmSoundPlay getReference() {   //获取单例对象
  if(s!=null)
  return s; 
  else
  return new AlarmSoundPlay();     
  }   
}****解除警报线程:
class FreeAlarm extends Thread    //解除警报线程
{
public void run()
{ int i=0;
  while(true)
 {
i++;
if(i==9999)
 {
  System.out.println("要解除警报!");
  AlarmSoundPlay AlarmSoundPlayObj=AlarmSoundPlay.getReference();
  AlarmSoundPlayObj.freeAlarm();
  break;
 }
 }
}
}****设置警报线程:
class InvokeAlarm extends Thread  //设置警报
{
public void run()
{
AlarmSoundPlay AlarmSoundPlayObj=AlarmSoundPlay.getReference();
AlarmSoundPlayObj.setAlarm();//改变表示变量
AlarmSoundPlayObj.playAlarm();//打印"alarm"
}
}
****测试程序:
public class test {
public static void main(String[] args) {
InvokeAlarm obj=new InvokeAlarm();
FreeAlarm obj3=new FreeAlarm();
obj.start();    //启动警报线程,会一直打印"alarm"
obj3.start();    //启动解除警报线程,当i为9999时,解除警报
}
}