示例代码:
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; } }
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) { } } } } }
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(); } }
准备运行--》 线程2号在等待。。 线程3号在等待。。 运行中。。。。。 运行中。。。。。 线程2号在等待。。 线程3号在等待。。 运行中。。。。。 线程2号在等待。。 线程3号在等待。。 线程3号在等待。。 线程2号在等待。。 运行中。。。。。 运行中。。。。。 线程3号在等待。。 线程2号在等待。。 运行完毕--》 准备运行--》 运行中。。。。。 线程3号在等待。。 运行中。。。。。 线程3号在等待。。 运行中。。。。。 线程3号在等待。。 线程3号在等待。。 运行中。。。。。 运行中。。。。。 线程3号在等待。。 运行完毕--》 线程3号在等待。。 准备运行--》 运行中。。。。。 运行中。。。。。 运行中。。。。。 运行中。。。。。 运行中。。。。。 运行完毕--》