您的位置:首页 > 编程语言 > Java开发

java中结合单例模式,控制单例类的某方法在被多线程调用时,只被1个线程调用执行,执行完毕后才被另一线程调用

2013-01-20 12:05 405 查看
示例代码:

1、定义单例类

package sigle;

//懒汉式单例类.在第一次调用的时候实例化
public class Singleton {
//私有的默认构造子
private Singleton()
{
//初始化标识位
setFlag(true);
}
//注意,这里没有final
private static Singleton single=null;
//静态工厂方法
public synchronized  static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}

//标识方法是否在调用中 true为调用中,false标识调用完毕
private static boolean Flag;

//演示方法调用
public void Print() {
setFlag(false);
System.out.print("准备运行--》\n");
try {
for (int i = 0; i < 5; i++) {
System.out.print("运行中。。。。。\n");
Thread.sleep(1000);
}
} catch (Exception e) {
}
System.out.print("运行完毕--》\n");
//设置标识值为true
setFlag(true);
}

public static boolean getFlag() {
return Flag;
}

private void setFlag(boolean flag) {
Flag = flag;
}

}


2、调用此方法的类

package sigle;

public class Run extends Thread{

Singleton s2;
public  Run() {
s2=Singleton.getInstance();
}
public void run(){
//循环判断
while (true) {
if (Singleton.getFlag()) {

s2.Print();
break;//执行完毕退出循环
}else {
try {
System.out.print(this.getName()+"在等待。。\n");
Thread.sleep(1000);
} catch (Exception e) {
}
}

}

}
}


3、多线程并发调用

package sigle;

public class MyRun {

/**
* @param args
*/
public static void main(String[] args) {
Run r1=new Run();
Run r2=new Run();
Run r3=new Run();
r1.setName("线程1号");
r2.setName("线程2号");
r3.setName("线程3号");
r1.start();
r2.start();
r3.start();

}

}


4、执行结果,验证print方法同时只被1个线程调用执行

准备运行--》
线程2号在等待。。
线程3号在等待。。
运行中。。。。。
运行中。。。。。
线程2号在等待。。
线程3号在等待。。
运行中。。。。。
线程2号在等待。。
线程3号在等待。。
线程3号在等待。。
线程2号在等待。。
运行中。。。。。
运行中。。。。。
线程3号在等待。。
线程2号在等待。。
运行完毕--》
准备运行--》
运行中。。。。。
线程3号在等待。。
运行中。。。。。
线程3号在等待。。
运行中。。。。。
线程3号在等待。。
线程3号在等待。。
运行中。。。。。
运行中。。。。。
线程3号在等待。。
运行完毕--》
线程3号在等待。。
准备运行--》
运行中。。。。。
运行中。。。。。
运行中。。。。。
运行中。。。。。
运行中。。。。。
运行完毕--》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: