线程池工具类

public class ThreadPoolUtil {public static final long DEFAULT_WAIT_SECONDS = 5000;private static class ThreadPool {private static final ThreadFactory namedThreadFactory =new ThreadFactoryBuilder().setNameFormat("thread-pool-%d").build();private static final ThreadPoolExecutor pool = new ThreadPoolExecutor(20, 40, 60L, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(200), namedThreadFactory, new ThreadPoolExecutor.DiscardPolicy()) {@Overrideprotected void afterExecute(Runnable r, Throwable t) {super.afterExecute(r, t);printException(r, t);}};}/*** 获取线程池.*/public static ExecutorService getThreadPool() {log.info("ThreadPool task num now: {}", ThreadPool.pool.getActiveCount());return ThreadPool.pool;}private static void printException(Runnable r, Throwable t) {if (t == null && r instanceof Future<?>) {try {Future<?> future = (Future<?>)r;if (future.isDone()) {future.get();}} catch (CancellationException ce) {t = ce;} catch (ExecutionException ee) {t = ee.getCause();} catch (InterruptedException ie) {Thread.currentThread().interrupt(); // ignore/reset}}if (t != null) {log.error(t.getMessage(), t);}}/*** 使用线程池并发执行任务.** @param callables*            任务列表** @param waitSeconds*            等待时间(秒)** @return.*/public static <T> List<T> executeTasks(List<Callable<T>> callables, long waitSeconds) {return doExecute(callables, waitSeconds, ThreadPool.pool);}private static <T> List<T> doExecute(List<Callable<T>> callables, long waitSeconds, ThreadPoolExecutor executor) {try {List<T> result = Lists.newArrayList();if (callables == null || callables.isEmpty()) {return result;}List<Future<T>> futures = executor.invokeAll(callables);try {for (Future<T> future : futures) {result.add(future.get(waitSeconds, TimeUnit.SECONDS));}} catch (Exception e) {throw e;} finally {for (Future<T> future : futures) {try {future.cancel(true);} catch (Exception e2) {}}}return result;} catch (Exception e) {log.error("doExecute error", e);throw new RuntimeException(e.getMessage());}}
}

使用Callable

public String getTableOwnersByTableGuid(List<String> tableGuids) {String ret = "[";List<Callable<String>> callables = Lists.newArrayList();tableGuids.stream().forEach(tableGuid -> {Callable<String> callable = () -> Optional.ofNullable(odpsTableManager.queryOdpsTableBaseInfo(tableGuid)).map(GetMetaTableBasicInfoResponse.Data::getOwnerId).orElse(null);callables.add(callable);});List<String> ownerIdList = ThreadPoolUtil.executeTasks(callables, ThreadPoolUtil.DEFAULT_WAIT_SECONDS).stream().filter(Objects::nonNull).collect(Collectors.toList());for (String ownerId : ownerIdList) {ret += "'" + ownerId + "',";}return StringUtils.stripEnd(ret, ",") + "]";}

使用CompletableFuture

public String getTableOwnersByTableGuid1(List<String> tableGuids) {String ret = "[";List<CompletableFuture<String>> completableFutureList = Lists.newArrayList();tableGuids.stream().forEach(tableGuid -> {try {CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> odpsTableManager.queryOdpsTableBaseInfo(tableGuid).getOwnerId());completableFutureList.add(future);} catch (Exception e) {log.info("getTableOwnersByWorkOrderId queryOdpsTableBaseInfo fail");}});List<String> ownerIdList = completableFutureList.stream().map(CompletableFuture::join).collect(Collectors.toList());for (String ownerId : ownerIdList) {ret += "'" + ownerId + "',";}return StringUtils.stripEnd(ret, ",") + "]";}

java多线程分批调用接口相关推荐

  1. Java 数据分批调用接口的正确姿势

    一.背景 现实业务开发中,通常为了避免超时.对方接口限制等原因需要对支持批量的接口的数据分批调用. 比如List参数的size可能为 几十个甚至上百个,但是假如对方dubbo接口比较慢,传入50个以上 ...

  2. java多线程异步调用别的系统接口代码_抢先准备,40个 Java 多线程面试题及答案大汇总!...

    ↑↑↑点上方蓝字关注并标⭐「IT技术思维」 一起培养顶尖技术思维 来源:程序员共成长(id:finishbug) 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有 ...

  3. java多线程异步调用别的系统接口代码_60 多个实例讲解,彻底搞懂 Java 多线程!

    ​JAVA 最难学的部分是哪里?很多朋友都会说:「 java 多线程 」. 随着业务量和数据的增加,企业不可避免地会使用多线程的方式处理数据.在 Java 职位的面试中,多线程也是必考的高阶知识点之一 ...

  4. java多线程分批执行任务demo

    一.需求描述 利用线程池实现多线程分批执行任务. 例如:线程池容量为10,我有20个任务,第一次利用线程池中的10个线程异步执行完10个任务.10个任务完成后,不管任务成功或者失败,线程池回收10个线 ...

  5. Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock

    在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(Reentrant ...

  6. java多线程------实现Runnable接口创建多进程,实现资源共享

    //实现Runnable接口创建多进程,实现资源共享 package xian_cheng;public class Example05 {public static void main(String ...

  7. Java多线程-实现Callable接口的call()方法,示例

    创建步骤,首先实现Callable接口的call()方法并指定返回值:然后创建实现类实例:FutureTask类使用Callable实现类的实例通过FutureTask的单参数构造器创建FutureT ...

  8. 【无标题】java多线程分批同步数据设计与实现(转载)

      已识乾坤大,犹怜草木青.          --旷怡亭口占 文章目录 前言 设计思路 代码实践 前言 最近接到一个任务,将mysql中的数据同步到elasticsearch中,要求异步执行,接口不 ...

  9. Java 多线程分批同步数据

      已识乾坤大,犹怜草木青.          --旷怡亭口占 文章目录 前言 设计思路 代码实践 前言 最近接到一个任务,将mysql中的数据同步到elasticsearch中,要求异步执行,接口不 ...

最新文章

  1. 新浪云python示例_在新浪云上部署Django应用程序
  2. Python进行时间序列平稳检验ADFtest(Augmented Dickey-Fuller Unit Root Test)
  3. iphone照片删掉又出现_iPhone 内存不够用,原因在这儿!
  4. win10下gnuplot的安装
  5. SAP UI5 global configuration interface
  6. Android之在ubuntu上常用的am、pm命令的总结
  7. DFS深搜与BFS广搜专题
  8. python 中BeautifulSoup入门
  9. cgi硬盘安装器_系统镜像安装CGI备份还原
  10. JAVA中.jsp模板文件AJAX异步请求 - 数据渲染问题
  11. jQuery hover事件
  12. android debug bridge tools_飞凌干货丨Android 应用程序如何获取system权限
  13. 关于IIS的IUSER和IWAM帐户
  14. Windows程序员进阶应该看的那些书
  15. 学习笔记---将Asp.Net网站发布到IIS的四种方法及注意事项
  16. My thoughts after NOIP 2018(2)
  17. js 获取浏览器高度、浏览器宽度
  18. 基于java jsp企业人事管理系统mysql
  19. kera中各种accuracy的介绍
  20. c语言 获取文件修改时间,C语言中用于修改文件的存取时间的函数使用

热门文章

  1. 微信小程序wx:for遍历列表后点击不同列表跳转不同页面
  2. 数据可视化ECharts:定制折线图1
  3. python 异或加密 (加密重要信息)
  4. 关于地推统计,APP地推统计哪家强?
  5. Ubuntu 配置网卡信息
  6. FA-PEG-MAL,叶酸-聚乙二醇-马来酰亚胺 实验用科研试剂;Folic acid PEG Maleimide
  7. echarts 设置X轴Y轴字体大小不成功问题处理
  8. 初三开始学计算机能够获奖吗,【喜报】我校初三王泽远同学喜获清华大学自主招生资格...
  9. 微信小程序之课程选择器
  10. 电脑在登陆界面如何打开计算机管理,melogincn管理页面电脑怎么进入?【图解】...