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

示例代码:

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号在等待。。
准备运行--》
运行中。。。。。
运行中。。。。。
运行中。。。。。
运行中。。。。。
运行中。。。。。
运行完毕--》



你可能感兴趣的:(java中结合单例模式,控制单例类的某方法在被多线程调用时,只被1个线程调用执行,执行完毕后才被另一线程调用)