java中ExecutorService使用多线程处理业务
1,定义线程对象Callable:Callable可以看成是一个增强版的Runnable, 带返回结果, 需要通过Future或者FutureTask来提交任务或运行线程, 然后通过Future/FutureTask的get方法得到返回结果.
Callable在子线程中运行, 在主线程中通过Future或者FutureTask来异步得到执行结果(get()方法是阻塞的), 或者检查是否已取消, 是否已完成(检查取消和完成的方法是非阻塞的)。
class CancelApprovalCallable implements Callable<JSONbject>{ private String id; private String domain; CancelApprovalCallable(String id,String domain){ this.id=id; this.domain = domain; } /* (non-Javadoc) * @see java.util.concurrent.Callable#call() */ @Override public JSObject call() throws Exception { return null; } }
2,使用线程池执行多线程
ExecutorService executorService = Executors.newFixedThreadPool(5); List<CancelApprovalCallable> callables = new List<>(); for(int i=0,len=idsArray.size();i<len;i++){ String id = idsArray.get(i); CancelApprovalCallable callable = new CancelApprovalCallable(id,domain); callables.add(callable); } List<Future<JSONObject>> resultList = new ArrayList<>(); try{ resultList = executorService.invokeAll(callables);//ExecutorService.invokeAll(Collection<Callable> tasks)能够批量提交任务,但是该方法只有在tasks全部执行完毕才返回包含各个任务对应的Future实例的列表。因此invokeAll方法批量提交任务的时候,任务等待返回结果的时间取决于这批任务中最耗时的任务。 }catch(InterruptedException e){ log.error("execute concurrent thread error",e); }finally{ if(!executorService.isShutdown() || !executorService.isTerminated()){ executorService.shutdown(); } }
ExecutorCompletionService中使用take()可以先获取任务已经执行完成的结果,而不需要等待所有任务执行完毕,但是假如没有一个任务执行完成也会阻塞获取结果。
3,获取执行结果
/** *批量获取线程执行结果,循环处理每条结果数据 */ for(Future<JSONObject> future : resultList){ JSONObject resp2 = null; try{ resp2 = future.get();//假如任务未完成,会阻塞获取结果 }catch(Exception e){ log.error("execute concurrent thread error",e); } if(resp2 == null){ continue; } }
分类:
java性能
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2016-06-16 查看数据库并行个数
2016-06-16 查看某个表空间下的表和索引
2016-06-16 查看某个表占用的存储空间