游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

深入理解Java线程池,这一篇就够了

  【死记硬背】1理解
  线程是稀缺资源,它的创建和销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,创建线程需要进行操作系统状态切换,为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配、调度和监控。2线程池的作用
  限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃。
  线程池不需要每次都去创建和销毁,节约了资源,并且响应速度快。3什么时候用线程池
  单个任务处理的时间比较短。
  需要处理的任务数量很大。4如何设置线程池的大小
  CPU密集型任务:
  CPU个数1的线程数
  IO密集型任务:
  两倍CPU个数1的线程数5线程池的组成
  一般的线程池主要由4部分组成:
  5。1线程池管理器:用于创建并管理线程池。
  5。2工作线程:线程池中的线程。
  5。3任务接口:每个任务必须实现的接口,用于工作线程调度其运行。
  5。4任务队列:用于存放待处理的任务,提供一种缓冲机制。6线程池的实现方式
  线程池的主要实现方式有五种:newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor和newWorkStealingPool。是通过Executor框架实现的,主要用到了Executor、Executors、ExecutorService、ThreadPoolExecutor、Callable、Future和FutureTask这几个类。7线程池涉及到的主要参数
  7。1corePoolSize:指定了线程池中的线程数量。
  7。2maximumPoolSize:指定了线程池中最大线程数量。
  7。3keepAliveTime:当前线程池数量超过corePoolSize时,多余的空闲线程的存活时间,即多少时间内会被销毁。
  7。4unit:keepAliveTime的时间单位。
  7。5workQueue:任务队列,被提交但尚未被执行的任务。
  7。6threadFactory:线程工厂,用于创建线程,一般用默认的即可。
  7。7handler:拒绝策略,当任务太多来不及处理,如何拒绝任务。8拒绝策略
  JDK内置的拒绝策略如下:
  8。1AbortPolicy:直接抛出异常,阻止系统正常运行。
  8。2CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。
  8。3DiscardOldestPolicy:丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。
  8。4DiscardPolicy:该策略默默地丢弃无法处理的任务,不予任何处理。如果允许任务丢失,这是最好的一种方案。
  以上内置拒绝策略均实现了RejectedExecutionHandler接口,若以上策略扔无法满足实际需要,完全可以自己扩展RejectedExecutionHandler接口。9Java线程池的工作过程
  9。1线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。
  9。2当调用execute()方法添加一个任务时,线程池会做如下判断:
  a)如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务;
  b)如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列;
  c)如果这时候队列满了,而且正在运行的线程数量小于maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
  d)如果队列满了,而且正在运行的线程数量大于或等于maximumPoolSize,那么线程池
  会抛出异常RejectExecutionException。
  9。3当一个线程完成任务时,它会从队列中取下一个任务来执行。
  9。4当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到corePoolSize的大小。
  【答案解析】
  五种常用线程池的实现方式:newCachedThreadPoolimportjava。util。concurrent。ExecutorService;importjava。util。concurrent。Executors;它是一个可以无限扩大的线程池;它比较适合处理执行时间比较小的任务;corePoolSize为0,maximumPoolSize为无限大,意味着线程数量可以无限大;keepAliveTime为60S,意味着线程空闲时间超过60S就会被杀死;采用SynchronousQueue装等待的任务,这个阻塞队列没有存储空间,这意味着只要有请求到来,就必须要找到一条工作线程处理他,如果当前没有空闲的线程,那么就会再创建一条新的线程。publicclassCachedThreadPoolTest{publicstaticvoidmain(String〔〕args){ExecutorServicecachedThreadPoolExecutors。newCachedThreadPool();for(inti0;i1000;i){try{Thread。sleep(2000);}catch(InterruptedExceptione){e。printStackTrace();}cachedThreadPool。execute(newRunnable(){Overridepublicvoidrun(){System。out。println(Thread。currentThread()。getName()正在被执行);}});System。out。println(执行完毕);}}}newFixedThreadPoolimportjava。util。concurrent。ExecutorService;importjava。util。concurrent。Executors;它是一种固定大小的线程池;corePoolSize和maximunPoolSize都为用户设定的线程数量nThreads;keepAliveTime为0,意味着一旦有多余的空闲线程,就会被立即停止掉;但这里keepAliveTime无效;阻塞队列采用了LinkedBlockingQueue,它是一个无界队列;由于阻塞队列是一个无界队列,因此永远不可能拒绝任务;由于采用了无界队列,实际线程数量将永远维持在nThreads,因此maximumPoolSize和keepAliveTime将无效publicclassFixedThreadPoolTest{publicstaticvoidmain(String〔〕args){ExecutorServicefixedThreadPoolExecutors。newFixedThreadPool(3);for(inti0;i10;i){finalintindexi;fixedThreadPool。execute(newRunnable(){Overridepublicvoidrun(){try{System。out。println(Thread。currentThread()。getName()正在执行index);Thread。sleep(2000);}catch(InterruptedExceptione){e。printStackTrace();}}});}}}newScheduledThreadPoolimportjava。util。concurrent。Executors;importjava。util。concurrent。ScheduledExecutorService;importjava。util。concurrent。TimeUnit;它接收SchduledFutureTask类型的任务,有两种提交任务的方式:1scheduledAtFixedRate2scheduledWithFixedDelaySchduledFutureTask接收的参数:time:任务开始的时间sequenceNumber:任务的序号period:任务执行的时间间隔它采用DelayQueue存储等待的任务DelayQueue内部封装了一个PriorityQueue,它会根据time的先后时间排序,若time相同则根据sequenceNumber排序;DelayQueue也是一个无界队列;工作线程的执行过程:工作线程会从DelayQueue取已经到期的任务去执行;执行结束后重新设置任务的到期时间,再次放回DelayQueuepublicclassScheduledThreadPoolTest{publicstaticvoidmain(String〔〕args){ScheduledExecutorServicescheduledThreadPoolExecutors。newScheduledThreadPool(5);scheduledThreadPool。schedule(newRunnable(){publicvoidrun(){System。out。println(延迟1秒执行);}},1,TimeUnit。SECONDS);scheduledThreadPool。scheduleWithFixedDelay(newRunnable(){Overridepublicvoidrun(){System。out。println(执行);}},1,1,TimeUnit。SECONDS);scheduledThreadPool。scheduleAtFixedRate(newRunnable(){Overridepublicvoidrun(){System。out。println(执行3);}},1,3,TimeUnit。SECONDS);}}newSingleThreadExecutorimportjava。util。concurrent。ExecutorService;importjava。util。concurrent。Executors;它只会创建一条工作线程处理任务;采用的阻塞队列为LinkedBlockingQueue;publicclassSingleThreadExecutorTest{publicstaticvoidmain(String〔〕args){ExecutorServicesingleThreadExecutorExecutors。newSingleThreadExecutor();for(inti0;i10;i){finalintindexi;singleThreadExecutor。execute(newRunnable(){publicvoidrun(){try{System。out。println(Thread。currentThread()。getName()正在被执行,打印的值是:index);Thread。sleep(1000);}catch(InterruptedExceptione){e。printStackTrace();}}});}}}newWorkStealingPoolimportjava。util。concurrent。;publicclassWorkStealingPoolTest{线程数privatestaticfinalintthreads10;用于计数线程是否执行完成staticCountDownLatchcountDownLatchnewCountDownLatch(threads);publicstaticvoidmain(String〔〕args)throwsException{test3();}publicstaticvoidtest1()throwsException{System。out。println(start);ExecutorServiceexecutorServiceExecutors。newWorkStealingPool();for(inti0;ithreads;i){executorService。execute((){try{System。out。println(Thread。currentThread()。getName());}catch(Exceptione){System。out。println(e);}finally{countDownLatch。countDown();}});}countDownLatch。await();System。out。println(end);}publicstaticvoidtest2()throwsInterruptedException{System。out。println(start);ExecutorServiceexecutorServiceExecutors。newWorkStealingPool();for(inti0;ithreads;i){Callable带返回值executorService。submit(newThread(newRunnable(){Overridepublicvoidrun(){try{System。out。println(Thread。currentThread()。getName());}catch(Exceptione){e。printStackTrace();}finally{countDownLatch。countDown();}}}));}countDownLatch。await();System。out。println(end);}publicstaticvoidtest3()throwsException{System。out。println(start);ExecutorServiceexecutorServiceExecutors。newWorkStealingPool();for(inti0;ithreads;i){Runnable带返回值FutureTasklt;?futureTasknewFutureTask(newCallableString(){callreturncurrentThreadNameOverridepublicStringcall(){returnThread。currentThread()。getName();}});executorService。submit(newThread(futureTask));System。out。println(futureTask。get());}System。out。println(end);}}
  【温馨提示】
  点赞收藏文章,关注我并私信回复【面试题解析】,即可100免费领取楼主的所有面试题资料!

简约游戏主机搭建,B5503060TI5600X废话在前:众所周知!AMD的ZEN3对比前任ZEN2架构,各方面均有着明显的提升!更是在单核性能强势反超了INTEL,以至于目前基础款的R55600X单核性能上都可以暴踩……互联网公司这些年圈了多少地?粗略估计,仅腾讯、百度、阿里、搜狐四家买地、买楼,所持总房产价值已超1000亿,这还不算另一块更有赚头的地产类投资。本文由无冕财经(wumiancaijing)原创首发……iPhone13即将面世,你看好它吗?还记得去年iPhone12系列刚刚发布时,网上就开始流传别买12了,等王守义说的十三香的消息,瞬间引爆整个手机圈,不少果粉都将手上老款iPhone机型换上新电池,再战一年,目的……快稳省,联发科天玑新一代5G基带M80定义R16时期5G标杆众所周知,2018年冻结的3GPPR15标准,是以满足5G基本功能而诞生的能用标准。如今,R16即将落地商用,业内纷纷展示了自家的技术储备。近日,联发科集中展示了多项移动平台最……蓝牙耳机推荐因为手机是安卓的,又有iPad,每次去自习室要带两个耳机真的好麻烦自从前段时间入手了魔浪05二代这款,完美的解决了我所有的问题。特色:充电仓可以反向充电,基本就是带着充电……又没电了?自带数据线的迷你数显充电宝,颜值高,华为苹果都能用现代人,都有手机电量缺失的焦虑症。变成红色的20要焦虑,只剩半格的50要苦恼,甚至连接近满格的90都要担忧不是满格电量。就算带了充电宝,每回在打开包扒拉充电宝的时候……多氟多聚焦智能制造,由氟化工向新能源新材料转型11月1~3日,由工业和信息化部、山东省人民政府共同主办的世界先进制造业大会在山东济南召开。大会发布了《世界先进制造业大会济南宣言》,提出先进制造业是世界经济发展的主导力量、创……外国人重走长征路说,什么25000里也就13000里!金一南2002年,两位在中国生活了几年的外国博士,辞掉了工作花费了384天重走长征路,并且写了一本叫做《两个人的长征》的书。书中对长征的距离表示了明确的质疑,外国人表示自己用GPS进……智能断路器市场前景怎么样?智能断路器市场前景怎么样?断路器做为常见的配电管理设备,广泛应用于很多场景,小到家庭的日常生活、大到工业园区的生产等各个领域,在用电市场上起着举足轻重的作用,几乎所有用电……荣耀畅玩20Pro开售,售价1699元,6400万超清四摄不国庆将临,很多朋友都准备趁此机会换新机。9月17日发布即开售的荣耀畅玩20Pro,凭借超清影像、超级快充、纤薄机身、OLED真彩屏,以及极具竞争力的价格,一经上市就收获了不小的……次元美人录之侠岚辰月因三月出生,所以才得此名。温柔大方,平易近人,外柔内刚,聪颖细腻,率真善良,一丝不苟,富有同情心。战斗中有时候也展现出犹豫、怯懦的一面。坚定的朝着成为一名优秀侠……移速无线磁吸充电四件套出差旅游可以更简单对于现在的打工人来说,出差时要同时带上电脑充电宝和至少一个手机以适应不同的工作,当然不仅是设备本身,很多时候由于设备间充电功率不同,我们通常会携带两到三个充电器以满足多设备的使……
以家人之名齐明月扮演者是谁齐明月结局和谁走到一起了近日,电视剧《以家人之名》正在热播当中,剧中齐明月虽然是个配角,但是感情线也是颇受大家的关注,齐明月最后结局和谁走到一起了呢?齐明月的扮演者是谁?一起来看一下具体的情况。1以家……大唐荣耀2结局没看懂,大唐荣耀2结局珍珠死了么历史剧《大唐荣耀2》给带来唐肃宗时期,所发生沈珍珠和广平王之间产生的乱世情感和朝堂内外的风云变幻,还发生宫廷上面的权谋较量,所进行结局时沈珍珠产后发现命不久矣,最后珍珠死在李俶……华为这次要翻车了?鸿蒙商标,别人10年前就注册了,华为败诉对于华为的鸿蒙系统,相信大家都是如雷贯耳了,毕竟自从2019年8月份发布后,就一直热度不减,经常被人提及,被人盼望。而按照华为的计划,6月初就会对符合要求的华为手机推送,……想装一台电脑,做渲染用,3000预算,有什么推荐的配置?做渲染的话你这预算太低了吧大家都说预算太紧,在我看来这个预算组一个渲染主机3000有余还能请朋友吃一顿火锅。这个预算选择至强加寨板才是明智的,我也看到部分回答提到了至强,……沉默的证明播出时间,沉默的证明剧情介绍刑侦剧《沉默的证明》安排在2021年11月9日播出,而给观众展现一起扑朔迷离的案中案被青年刑警陈默殚精竭虑,加上其它人的帮忙,最终把犯罪分子和藏极深的狡猾幕后黑手给击破,所展现……为十么二手笔记本市场里销售的大部分都是ThinkPad?主要是因为在笔记本电脑里,维修率最低的牌子是ThinkPad。ThinkPad里面,质量最好最结实耐用的就是X系列和T系列的了。从06年开始接触了T23机器,就基本上认定使用了……鸡毛飞上天结局完美吗,鸡毛飞上天玉珠江河有孩子吗商业剧《鸡毛飞上天》给带来以陈江河和妻子骆玉珠的感情和创业事情做为线索,所展现义乌改革发展30多年曲折和辉煌的历程,最后给展现结局特别圆满,并骆玉珠和陈江河之间有属于自己的孩子……七月与安生电视剧结局中安生和谁在一起都市剧《七月与安生》给带来性格迥异的安生和七月在高中时期成为闺蜜,不过她们在后期经历多重考验,得以成长,直到进行最后安生和七月没有跟家明在一起,并他们后期独自去生活。1七……为什么手机店里大多向顾客推荐vivooppo?就目前智能手机市场来看,线下的热度确实要高于线上,最重要的一点就是线下可以体验,而且现在大部分消费者选择手机价位都在两千以上,毕竟体验感觉会更好,所以线下体验再购买更靠谱,售后……如何看待老年人沉迷手机的问题?喜欢而以,说不上沉迷。每天还有那么多事等着我去做。用智能手机,是想从中找到自己的乐趣,我觉得,无非就是为了脑子不生锈,老人也有自己的思想,快乐。任何东西都应该有一个度,有利有弊……十部最良心国产电视剧豆瓣历史高评分良心国产良心国产电视剧TOP1《走向共和》2003年豆瓣评分:9。6张黎导演,为什么又是他。这部剧当时还是在中央一台看的,印象很深刻,好像后面被河蟹了。良心国产电视剧……2018年9。8分以上的国产电视剧十部豆瓣高分经典国产剧9。8分以上的国产电视剧你看过的有哪些?2018豆瓣高分国产电视剧,9。8分以上电视剧有哪些目前,国产剧中分数最高的是2007版的《大明王朝1566》,豆瓣评分高达9。7……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网