最近在写一个统计任务,恩,也不算最近了,过去一个多月了都。
任务要求,每周日凌晨之前统计用户总数及增长量,因为是分库分表的,统计维度要求到库级别和表级别。
大致实现思路,滚动时,每个表开一个线程做COUNT操作,因为要统计库级别的数据,所以需要等到所有线程结束后拿到所有线程的返回值,进行累加。(至于这里为什么滚动表的时候都要开一个线程,其实不开线程也OK的,但是,这种线程获取返回值的还没有用过嘛,好不容易有个机会,锻炼下)下面说代码了。
- 返回值的定义:Callable<T>定义时,可以使用自定义的类放在T的位置,类里面封装需要的属性;
- 返回值的接收:Future<T>,接收返回值就是用Future了,T就是定义的返回类了,和Callable中的T是同一个;
- 逻辑处理:重写call()方法,做自己的业务逻辑(这里遇到一个坑写在最后),return返回值;
- 返回参数的提交:一般是配合线程池来使用,定义一个线程池,submit()调用Callable的call方法,返回结果是Future对象,即便线程还没有结束,对象会先生成;
- 返回值的获取:用到的时候直接用接收参数的Future 对象.get()就ok了
说了挺多,怪啰嗦的,其实代码就是下面这样了:
结束的最后,说下自己掉进去的那个坑。
具体执行业务逻辑的时候从上面截图可以看到,是可以传参数过去的,我传了一个service过去,一直报空指针,直接在定义Callable的类中注入,也住不进去,这才有了上面这种写法,绕开了那个问题。就酱紫,恩、