4.2 阻塞(并发)调用
此类用于实现阻塞(并发)调用已有代码的功能. 可设定同步等待时间.当然针对1.5以上的jdk版本这里的Semaphnore类可以换成java.util.concurrent包中对应的类来实现.
/**//http://www.csdn.net/blog/Iangao * 阻塞(并发)调用 //http://www.csdn.net/blog/Iangao * @author iangao *///http://www.csdn.net/blog/Iangao public class BlockingCall{ /**//http://www.csdn.net/blog/Iangao * 回调接口 *///http://www.csdn.net/blog/Iangao public interface ICallBack{ void execute();//http://www.csdn.net/blog/Iangao }//http://www.csdn.net/blog/Iangao /** * 等待执行,如果millis时间内执行完callBack.execute,则call结束, * 如果未执行完,则不再等待,直接结束call调用。如果millis=0,则表示死等 *///http://www.csdn.net/blog/Iangao public static boolean call(long millis, final ICallBack callBack) throws InterruptedException{ final Semaphore s=new Semaphore(); new Thread(){//http://www.csdn.net/blog/Iangao public void run(){ callBack.execute();//http://www.csdn.net/blog/Iangao s.v();//http://www.csdn.net/blog/Iangao }//http://www.csdn.net/blog/Iangao }.start();//http://www.csdn.net/blog/Iangao return s.p(millis); }//http://www.csdn.net/blog/Iangao }//http://www.csdn.net/blog/Iangao |
下面演示其用法并测试其运行效果:
/** * BlockingCall 测试类 * @author iangao */ public class BlockingCallTest {//http://www.csdn.net/blog/Iangao static class Foo{//http://www.csdn.net/blog/Iangao public void action(long millis){//http://www.csdn.net/blog/Iangao try {//http://www.csdn.net/blog/Iangao Thread.sleep(millis);//http://www.csdn.net/blog/Iangao } catch (InterruptedException e) {} System.out.println("Foo.action() over!"); }//http://www.csdn.net/blog/Iangao }//http://www.csdn.net/blog/Iangao public static void main(String[] args) throws InterruptedException{ final Foo foo=new Foo();//http://www.csdn.net/blog/Iangao BlockingCall.call(1000, // 等待1秒 new BlockingCall.ICallBack(){//http://www.csdn.net/blog/Iangao public void execute() {//http://www.csdn.net/blog/Iangao foo.action(2000); // 执行2秒 }//http://www.csdn.net/blog/Iangao });//http://www.csdn.net/blog/Iangao // 1. 设置1000时,不等foo.action执行完就会执行后续处理, done=false // 2. 如果1000改成5000的话,则2秒后会执行下面语句,而不会等5秒, done=true if(done){//http://www.csdn.net/blog/Iangao System.out.println("执行成功, 继续后边的操作!"); }else{//http://www.csdn.net/blog/Iangao//http://www.csdn.net/blog/Iangao System.out.println("等待超时,如果foo支持cancel之类的操作," + "可以选择调用foo.cancel()," + "否则被调用的操作和后续的操作会并发的执行." + "主要看有什么样的需求"); }//http://www.csdn.net/blog/Iangao }//http://www.csdn.net/blog/Iangao }//http://www.csdn.net/blog/Iangao |
从上例中我们可以看出,通过BlockingCall的回调操作,我们可以通过调整call的等待时间来实现同步或异步的调foo.action()方法.