Java同步技术(十)

4.2 阻塞(并发)调用

此类用于实现阻塞(并发)调用已有代码的功能. 可设定同步等待时间.当然针对1.5以上的jdk版本这里的Semaphnore类可以换成java.util.concurrent包中对应的类来实现.

/**//http://www.csdn.net/blog/Iangao*阻塞(并发)调用//http://www.csdn.net/blog/Iangao*@authoriangao*///http://www.csdn.net/blog/Iangaopublicclass BlockingCall{ /**//http://www.csdn.net/blog/Iangao *回调接口 *///http://www.csdn.net/blog/Iangao publicinterface 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 publicstaticboolean call(long millis, final ICallBack callBack) throws InterruptedException{ final Semaphore s=new Semaphore(); new Thread(){//http://www.csdn.net/blog/Iangao publicvoid 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 returns.p(millis); }//http://www.csdn.net/blog/Iangao}//http://www.csdn.net/blog/Iangao

下面演示其用法并测试其运行效果:

/***BlockingCall测试类*@authoriangao*/publicclass BlockingCallTest {//http://www.csdn.net/blog/Iangao staticclass Foo{//http://www.csdn.net/blog/Iangao publicvoid 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 publicstaticvoid 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 publicvoid 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()方法.

一个人的期望值越大,心理承受力就会越小,就越经受不住失败的打击,

Java同步技术(十)

相关文章:

你感兴趣的文章:

标签云: