java定时任务中使用多线程_定时任务使用多线程注意事项

上传人:小** 文档编号:101045829 上传时间:2022-06-04 格式:DOC 页数:3 大小:38KB
返回 下载 相关 举报
java定时任务中使用多线程_定时任务使用多线程注意事项_第1页
第1页 / 共3页
java定时任务中使用多线程_定时任务使用多线程注意事项_第2页
第2页 / 共3页
java定时任务中使用多线程_定时任务使用多线程注意事项_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述
java定时任务中使用多线程定时任务使用多线程注意事项在定时任务中为了加快处理速度,一般都会使用多线程处理业务。需要注意一下事项:1. 定时任务是否允许上一个定时任务未结束,下一个定时任务可以启动,通过Scheduled中的配置在决定。2. 主线程已经关闭,线程池中的线程还在运行问题。线程池的关闭方法问题3. 定时任务有大量数据,导致服务无法停止问题。4. 如何获取线程的处理结果如下代码是示例,stop状态的使用和线程池shutdown的处理逻辑需要依据自己的业务来处理。PreDestroypublicvoiddestory()stop=true;线程停止状态,通过注解检测到服务器停止时修改stop状态booleanstop=false;/服务器启动后延迟1分钟执行,定时任务结束后延迟1分钟执行下一次Scheduled(initialDelay=60*1000L,fixedDelay=60*1000L)publicvoidscheduling()ListdataList=newArrayList();for(inti=0;i1000;i+)dataList.add(data_+i);intthreadSize=10;ExecutorServiceesPool=Executors.newFixedThreadPool(threadSize);/接收线程的完成时间或者其他返回结果CompletionServiceecs=newExecutorCompletionService(esPool);ConcurrentLinkedQueuequeue=newConcurrentLinkedQueue(dataList);logger.info(=start=,System.currentTimeMillis();/启动线程时修改退出线程状态stop=false;for(inti=0;ilongcount=0;线程处理加trycatch防止抛出异常中断线程,可能会导致线程池中所有的线程都中断,无可用线程try/!queue.isEmpty()比queue.size()0效率高很多.size()是要遍历一遍集合的while(!stop&!queue.isEmpty()Stringdata=queue.poll();/500可以在60秒内完成处理,正常退出改成1000如果不使用下面的收集结果代码,60秒内无法处理完,会强制shutdown抛出异常Thread.sleep(1000L);logger.info(dataok.,data);count+;catch(Exceptione)logger.error(,e);这里范围线程处理的结果returnSystem.currentTimeMillis()+_+count;);/获取线程的返回结果会阻塞主线程,直到线程池中所有的线程返回结果/*tryfor(inti=0;ithreadSize;i+)StringthreadTime=ecs.take().get();logger.info(threadrunoktime:+threadTime);catch(InterruptedExceptione)e.printStackTrace();catch(ExecutionExceptione)e.printStackTrace();*/关闭线程池tryesPool.shutdown();logger.info(esPollshutdown:,DateUtil.format(newDate(),DateUtil.PATTERN_DEFAULT);线程池阻塞,到指定的时间退出,如果所有线程执行完成返回true否则返回falsebooleanawait=esPool.awaitTermination(60*1000L,TimeUnit.MILLISECONDS);logger.info(esPool.awaitTermination1:,await,DateUtil.format(newDate(),DateUtil.PATTERN_DEFAULT);if(!await)stop=true;await=esPool.awaitTermination(10*1000L,TimeUnit.MILLISECONDS);logger.info(esPool.awaitTermination2:,await,DateUtil.format(newDate(),DateUtil.PATTERN_DEFAULT);if(!await)logger.info(wait60snotstop,shutdownNow);/超时的时候向线程池中所有的线程发出中断(interrupted)。/让线程池中的所有线程立即中断。会抛出异常esPool.shutdownNow();catch(InterruptedExceptione)/awaitTermination方法被中断的时候也中止线程池中全部的线程的执行。esPool.shutdownNow();logger.error(awaitTermination,e);logger.info(=end=,System.currentTimeMillis();
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!