java 同步调用第三方sdk提供异步监听方法
2016-10-15 09:26
513 查看
CountDownLatch类的用法:
今日碰到这样的问题。调用第三方sdk的方式提供的api,发现api以监听的方式异步返回结果,而我方要求提供实时数据给用户,所以这里就涉及到第三方异步接口同步调用的问题。开始的想法是以简单的while语句循环使用,但这种方式实在不优雅。经同事提点采用了JDK中提供的CountDownLatch类解决“第三方异步接口同步调用”这个问题。下面是对CountDownLatch的介绍。
CountDownLatch是一个多线之间的阻塞器,实例化时可以指定计数器的个数(这里假设为4)。通过await()进行阻塞主线程等待,然后可以调用countDown()进行计数器的递减,直到4递减为0,表示所有子线程的任务全部结束。之后被阻塞的线程才会继续往下执行。
实例代码如下
package com.dmain.test;
import java.util.concurrent.CountDownLatch;
import com.dmain.listenter.DemoListenter;
public class CountDownLatchTest {
}
package com.dmain.listenter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public abstract class DemoListenter {
}
今日碰到这样的问题。调用第三方sdk的方式提供的api,发现api以监听的方式异步返回结果,而我方要求提供实时数据给用户,所以这里就涉及到第三方异步接口同步调用的问题。开始的想法是以简单的while语句循环使用,但这种方式实在不优雅。经同事提点采用了JDK中提供的CountDownLatch类解决“第三方异步接口同步调用”这个问题。下面是对CountDownLatch的介绍。
CountDownLatch是一个多线之间的阻塞器,实例化时可以指定计数器的个数(这里假设为4)。通过await()进行阻塞主线程等待,然后可以调用countDown()进行计数器的递减,直到4递减为0,表示所有子线程的任务全部结束。之后被阻塞的线程才会继续往下执行。
实例代码如下
package com.dmain.test;
import java.util.concurrent.CountDownLatch;
import com.dmain.listenter.DemoListenter;
public class CountDownLatchTest {
private static String result = null; public static void main(String[] args) throws InterruptedException { final CountDownLatch countDownLatch = new CountDownLatch(1); new DemoListenter("my name") { @Override public void getResult(String message) { result = message; countDownLatch.countDown(); } @Override public void error(String errorInfor) { countDownLatch.countDown(); } }; countDownLatch.await(); System.out.println("current return user:"+result); }
}
package com.dmain.listenter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public abstract class DemoListenter {
//创建单线程池 private ExecutorService singleThread = Executors.newSingleThreadExecutor(); private String param; public DemoListenter(){ } public DemoListenter(String param){ this.param = param; init(); } protected void init(){ singleThread.execute(new Runnable(){ @Override public void run() { doSomething(); } }); } public void doSomething() { try { System.out.println("begin doSomething!"); String upParam = param.toUpperCase(); //这里假设处理业务要消耗一定的时间。 Thread.sleep(1200); getResult(upParam); System.out.println("end doSomething!"); } catch (Exception e) { error("happen exception!"); e.printStackTrace(); } } public abstract void getResult(String message); public abstract void error(String errorInfor);
}
相关文章推荐
- 用异步的方式调用同步方法
- C# 异步编程 异步委托调用同步方法
- asyn4j java 异步方法调用框架
- 【java performance】不要在循环中调用synchronized(同步)方法
- 使用异步方式调用同步方法(实例详解)
- 为同步方法提供异步支持,图示
- thrift java多线程非阻塞同步/异步调用实例
- ajax 同步调用 返回字符串 java例子(全)及 从后台返回中文乱码解决方法
- java异步调用的方法
- java提供在一个类的main方法中调用另一个类的main方法
- [Silverlight入门系列]同步调用多个WCF RIA Services的异步方法
- C#的新特性体验(异步方法的同步调用)
- Dnode:基于Node.js给浏览器提供异步远程方法调用
- WCF方法“异步调用”的“同步问题”
- 使用异步方式调用同步方法
- C#使用异步方式调用同步方法
- java 调用 bat 如果里面用了第三方命令 dos 窗口没有关闭 解决方法
- Dnode:基于Node.js给浏览器提供异步远程方法调用
- C#的同步和异步调用方法
- 使用异步方式调用同步方法