Callable获取返回值

本文介绍了一种在分库分表环境下,通过多线程并行处理实现库级和表级用户数据统计的方法。利用Callable与Future组合,对每个表开启独立线程执行COUNT操作,收集并汇总数据。

最近在写一个统计任务,恩,也不算最近了,过去一个多月了都。

任务要求,每周日凌晨之前统计用户总数及增长量,因为是分库分表的,统计维度要求到库级别和表级别。

大致实现思路,滚动时,每个表开一个线程做COUNT操作,因为要统计库级别的数据,所以需要等到所有线程结束后拿到所有线程的返回值,进行累加。(至于这里为什么滚动表的时候都要开一个线程,其实不开线程也OK的,但是,这种线程获取返回值的还没有用过嘛,好不容易有个机会,锻炼下)下面说代码了。

  • 返回值的定义:Callable<T>定义时,可以使用自定义的类放在T的位置,类里面封装需要的属性;
  • 返回值的接收:Future<T>,接收返回值就是用Future了,T就是定义的返回类了,和Callable中的T是同一个;
  • 逻辑处理:重写call()方法,做自己的业务逻辑(这里遇到一个坑写在最后),return返回值;
  • 返回参数的提交:一般是配合线程池来使用,定义一个线程池,submit()调用Callable的call方法,返回结果是Future对象,即便线程还没有结束,对象会先生成;
  • 返回值的获取:用到的时候直接用接收参数的Future 对象.get()就ok了

说了挺多,怪啰嗦的,其实代码就是下面这样了:

 结束的最后,说下自己掉进去的那个坑。

具体执行业务逻辑的时候从上面截图可以看到,是可以传参数过去的,我传了一个service过去,一直报空指针,直接在定义Callable的类中注入,也住不进去,这才有了上面这种写法,绕开了那个问题。就酱紫,恩、

CountDownLatch本身不能直接获取返回值。CountDownLatch是一个用于控制并发的工具,它允许一个或多个线程等待其他线程执行到某一操作,核心功能在于线程的同步,即让一些线程等待另一些线程完成特定任务后再继续执行,并非用于获取线程的返回值 [^1]。 在常见的使用场景中,CountDownLatch主要是通过`countDown()`方法来减少计数器的值,当计数器减为 0 时,调用`await()`方法而被阻塞的线程会被唤醒,但它并没有提供获取线程执行结果的机制 [^2]。 若需要获取线程的返回值,可以结合其他方式实现,例如使用`Callable`接口和`Future`接口。`Callable`接口的`call()`方法可以有返回值,而`Future`接口可以用来获取`Callable`任务的返回结果。以下是一个简单示例代码: ```java import java.util.concurrent.*; public class CountDownLatchWithResult { public static void main(String[] args) throws InterruptedException, ExecutionException { int taskCount = 3; CountDownLatch countDownLatch = new CountDownLatch(taskCount); ExecutorService executorService = Executors.newFixedThreadPool(taskCount); Future<Integer>[] futures = new Future[taskCount]; for (int i = 0; i < taskCount; i++) { final int index = i; futures[i] = executorService.submit(() -> { try { // 模拟任务执行 Thread.sleep(100); return index * 2; } catch (InterruptedException e) { e.printStackTrace(); return -1; } finally { countDownLatch.countDown(); } }); } countDownLatch.await(); for (Future<Integer> future : futures) { System.out.println("Task result: " + future.get()); } executorService.shutdown(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值