有一个大list集合,遍历进行一些耗时操作,不能达到性能要求,查询日志,单个任务虽然有不少数据库和第三方api请求,比较耗时,但返回效率尚可,所以优先采用多线程方式进行处理并行请求数据库和第三方api,因为处理完还要对list所属的数据进行操作,所以,线程池多线程处理要等待全部处理完。
相关的代码如下:
@testpublic void testtb(){ list list = new arraylist (); for(int i = 0; i 100) { int batch = size % 100 == 0 ? size / 100 : size / 100 + 1; for(int j = 0; j size) { end = size; } list sublist = list.sublist(j * 100, end); touchworker.execute(() - > sleeptest(sublist)); } touchworker.shutdown(); while(true) { if(touchworker.isterminated()) { break; } } } else { sleeptest(list); }}private void sleeptest(list sublist){ for(string i: sublist) { try { //耗时操作 system.out.println(###### + i + ###### + thread.currentthread().getname()); // thread.sleep(1000*30); } catch(exception e) { e.printstacktrace(); } }} void shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。若已经关闭,则调用没有其他作用。
抛出:securityexception - 如果安全管理器存在并且关闭,此 executorservice 可能操作某些不允许调用者修改的线程(因为它没有保持runtimepermission(modifythread)),或者安全管理器的 checkaccess 方法拒绝访问。
boolean isterminated() 若关闭后所有任务都已完成,则返回true。注意除非首先调用shutdown或shutdownnow,否则isterminated永不为true。返回:若关闭后所有任务都已完成,则返回true。
当然还有一种方法,是之前写的,方法比上边的臃肿了,不过会获取返回结果进行处理:逻辑是获取所有页面的list,多线程遍历list后,将所有页面的违规词查出发送邮件,代码:
/** * 落地页违规词排查(多线程)。 * @return */@testpublic void getviolationslandpagebythreadpool() { try { landpageservice.getviolationslandpagebythreadpool(1年); } catch (exception e) { e.printstacktrace(); }}// 开始时间long start = system.currenttimemillis();/*list list = new arraylist();for (int i = 1; i {});*/// 创建一个线程池executorservice exec = executors.newfixedthreadpool(threadnum);// 定义一个任务集合list
tasks = new arraylist();callable task = null;list cutlist = null;// 确定每条线程的数据for (int i = 0; i < threadnum; i++) { if (i == threadnum - 1) { if (special) { break; } cutlist = list.sublist(threadsize * i, datasize); } else { cutlist = list.sublist(threadsize * i, threadsize * (i + 1)); } // system.out.println(第 + (i + 1) + 组: + cutlist.tostring()); final list liststr = cutlist; task = new callable() { @override public list call() throws exception {// system.out.println(thread.currentthread().getname() + 线程: + liststr.get(0).getpageid()); list result = new arraylist(); for (landpage landpage : liststr) { long pageid = landpage.getpageid(); string path = landpage.getpath(); integer version = landpage.getversion(); string pageurl = landpage.getpageurl(); string actualuser = landpage.getactualuser(); integer pagetype = landpage.getpagetype(); if (stringutils.isnotblank(path)) { // 调用第一个方法,获取html字符串 string html = httprequest(path); // 调用第二个方法,获取包含的违规词 if(stringutils.isnotblank(html)){ html = html.replaceall(,);// string buffer = htmlfiter2(html); set bufferset = sensitivewordengine.getsensitiveword(html, 1);// 得到敏感词有哪些,传入2表示获取所有敏感词//sensitivewordfiltering(html); /*string[] word = {备案,错过将延误,仅需1980元}; for(int i=0 ;i results = exec.invokeall(tasks);list result = new arraylist();for (future future : results) { result.addall(future.get());}// 关闭线程池exec.shutdown();system.out.println(线程任务执行结束);system.err.println(执行任务消耗了 : + (system.currenttimemillis() - start) + 毫秒);system.out.println(共有###########+list.size() ); result就是需要发送邮件的相关结果了
厦门举办首届无人机行业交流,探索无人机的应用蓝海
关于汽车电子ECU的三种形式
我国首次实现对特高压交流变压器套管运行状态的实时监测
微软可能很快将云数据存储在DNA存储中
华为P10评测:麒麟960+EMUI 5.1 注定不凡
List集合:多线程快速处理
如何制作玩具锂电池充电器
VR市场规模比肩智能手机 要颠覆还有两个关键点
三相异步电动机上的故障解决
哪些物联网应用可以减少企业犯错
未来性能增长需依赖架构上改变 因此需要用FPGA进行人工智能硬件加速
锡膏厂家普及锡条一些干货知识?
慧联无限完成数亿元C轮融资,通服资本领投,旷视科技、博将资本、华创资本跟投
最美不过华为荣耀8青春版 最快不过华为荣耀v9 两部手机今天发布!
工业清洗用超声波振动棒
灌封胶产生气泡原因及消除方法
什么是运算放大器/比较器?
中国量产64层3D NAND闪存芯片会带来什么影响
美格智能连续中标中国移动5G模组招标项目
硅晶圆供不应求到进入涨价周期,行业进入量价齐升的高景气度确定