前言:
如今小伙伴们对“java线程执行一半消失了怎么解决”大体比较关心,朋友们都想要学习一些“java线程执行一半消失了怎么解决”的相关文章。那么小编在网上搜集了一些对于“java线程执行一半消失了怎么解决””的相关知识,希望各位老铁们能喜欢,姐妹们快快来了解一下吧!Java线程对于提速是很明显的,你想想铲车装沙子,翻斗车一辆辆在后边排着等着装沙子速度是很慢的,而线程就不一样了不需要排队,速度肯定是要快的。
线程是在进程中执行的,他快但是需要消耗更多的性能,所以我们在实际项目中使用要综合考虑服务器性能等原因来决定线程池大小。还要注意是否使用线程依项目而定,也不要盲目使用。
今天来给大家说说线程的一个应用情况。(数据接口)数据是通过指定分类接口来获取的,如果我们需要多个分类的数据,那么就需要调用多个接口。
存在这样一种情况:前台页面需要展示上百个分类,那么就需要在前端调用上百次接口,这种方式页面响应可能快吗?这种情况线程就是很好的选择之一了。
使用java单独写一个接口,这个接口里使用线程调用数据接口,亲测啊,速度至少要提高一半以上的,下边是主要代码:
//临时结果集,不能使用arrayList,ArrayList是线程不安全的,可能会导致数据丢失//创建线程安全的临时结果集CopyOnWriteArrayList<Vo> grapDataThreadResult = new CopyOnWriteArrayList<>();//创建线程池,不建议使用Executors工具类,推荐使用ThreadPoolExecutorThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 100, 10, TimeUnit.SECONDS,new ArrayBlockingQueue<>(1024), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());try {for (String dataId : dataIds) {GrapDataThread grapDataThread = new GrapDataThread(dataId, beginDate, endDate, userId,grapDataThreadResult);threadPoolExecutor.execute(grapDataThread);}threadPoolExecutor.shutdown();//所有线程执行完毕后关闭线程池// 时刻去检测线程池是否关闭while(true){if(threadPoolExecutor.isTerminated()){//判断线程池是否关闭result.addAll(grapDataThreadResult);break;}}}catch (Exception e){e.printStackTrace();}finally {threadPoolExecutor.shutdown();}
实测结果:
传递50多个参数,相当于50多个接口
响应时间如下,响应数据量大需要的时间也会多的
阿里建议使用ThreadPoolExecutor,Executor框架有其局限性,不够灵活,另外Executor也是通过ThreadPoolExecutor方式实现的,ThreadPoolExecutor能定制符合自己业务场景需求,避免资源耗尽的风险。
ThreadPoolExecutor构造参数介绍:
corePoolSize:指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到workQueue任务队列中去;
maximumPoolSize:指定了线程池中的最大线程数量,这个参数会根据你使用的workQueue任务队列的类型,决定线程池会开辟的最大线程数量;
keepAliveTime:当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁;
unit:keepAliveTime的单位
workQueue:任务队列,被添加到线程池中,但尚未被执行的任务;它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种;
threadFactory:线程工厂,用于创建线程,一般用默认即可;
handler:拒绝策略;当任务太多来不及处理时,如何拒绝任务;
动动发财的小手给个赞和关注,谢谢大家
标签: #java线程执行一半消失了怎么解决