站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题多线程基本问题!!希望给位高手给予援手!!十分感谢!!~~~谢谢!~~~

多线程基本问题!!希望给位高手给予援手!!十分感谢!!~~~谢谢!~~~

摘要: 多线程基本问题!!希望给位高手给予援手!!十分感谢!!~~~谢谢!~~~


我想做两个线程,一个线程是发出警报,一个线程解除警报,想通过两个线程修改同一个布尔变量来实现.
但问题是:我在一个线程内修改完之后,另一个线程使用的值还是以前的值,也就是"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时,解除警报
}
}


public static AlarmSoundPlay getReference() { //获取单例对象
if(s!=null)
return s;
else
return new AlarmSoundPlay();
}

把 else 改为 :

else{
s = new AlarmSoudPlay();
return s ;
}





thanks


↑返回目录
前一篇: 一个JAVA题帮我看一下呀
后一篇: 请问关于List和hashmap的书,有哪些写的比较好的?