幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

Java多线程七种线程池,你知道它们的用途优缺点都是什么吗?

  Java是一门广泛应用于后端开发的高级编程语言。在多线程编程中,线程池被广泛应用以优化性能。线程池通过控制线程数量、管理任务队列等方式来提高程序的响应速度、降低系统负载。
  Java中常用的线程池有以下七种:FixedThreadPool(固定大小线程池):线程数量固定,适用于处理稳定且长时间运行的任务。CachedThreadPool(可变大小线程池):线程数量不固定,会根据需要动态创建或销毁线程。适用于执行大量短期异步任务的场景。ScheduledThreadPool(定时器线程池):适用于需要定时执行任务的场景。SingleThreadExecutor(单一线程池):只有一个线程的线程池,适用于顺序执行各个任务的场景。WorkStealingPool(工作密取线程池):线程数会根据需要自动调整,适用于执行大量的独立任务。ForkJoinPool(分治线程池):适用于任务可以分解为子任务的场景,使用workstealing算法提高任务处理效率。SingleThreadScheduledExecutor(单一定时线程池):只有一个线程的定时器线程池,适用于需要将多个定时任务串行执行的场景。1。FixedThreadPool
  创建方式
  在Java中创建FixedThreadPool线程池时,我们需要使用Executors类提供的静态方法之一。以下是创建一个大小为3的FixedThreadPool线程池的示例代码:ExecutorServiceexecutorExecutors。newFixedThreadPool(3);
  用途
  FixedThreadPool线程池主要用于处理大量长时间运行的任务,并且需要限制线程数量的情况。线程池创建时就会初始化固定数量的线程,当有任务提交到线程池时,如果有空闲线程就立即执行任务,否则就将任务放入等待队列中,直到有空闲线程再去执行。
  优点线程数量固定,重复利用已经创建的线程,避免了线程的频繁创建和销毁,从而提高了程序的性能;可以控制线程的最大数量,防止系统性能因线程过多而降低;可以对多个任务进行统一的管理,如设置线程池的最大任务数、最大线程数、线程空闲时间、拒绝策略等。
  缺点由于线程数量是固定的,如果任务过多,可能会导致线程饱和,无法处理更多的任务;在任务完成后,线程可能会一直保留,浪费系统资源,需要手动关闭线程池。
  示例代码
  下面是一个FixedThreadPool线程池示例,在该示例中,我们创建了一个大小为3的FixedThreadPool线程池,并将5个任务提交到线程池中执行:importjava。util。concurrent。ExecutorService;importjava。util。concurrent。Executors;publicclassFixedThreadPoolDemo{publicstaticvoidmain(String〔〕args){ExecutorServiceexecutorExecutors。newFixedThreadPool(3);for(inti0;i5;i){finalinttaski;executor。execute((){System。out。println(String。format(Taskdisexecutedbythreadd,task,Thread。currentThread()。getId()));});}executor。shutdown();关闭线程池}}
  运行日志讲解
  当我们运行上述示例代码时,可以看到如下的运行日志:Task0isexecutedbythread13Task1isexecutedbythread15Task2isexecutedbythread14Task3isexecutedbythread13Task4isexecutedbythread15
  从日志中可以看出,FixedThreadPool线程池在默认情况下使用了3个线程来执行5个任务,当有一个线程完成任务后,会立即去执行队列中等待的任务。2。CachedThreadPool
  创建方式
  在Java中创建CachedThreadPool线程池时,我们需要使用Executors类提供的静态方法之一。以下是创建一个CachedThreadPool线程池的示例代码:ExecutorServiceexecutorExecutors。newCachedThreadPool();
  用途
  CachedThreadPool线程池主要用于处理大量短时间运行的任务,并且需要快速响应的情况。线程池中的线程数会根据任务数量的多少自动增减,当有任务提交到线程池时,如果有空闲线程就立即执行任务,否则就创建新线程处理任务。
  优点可以根据任务数量的多寡自动调整线程池中的线程数,避免了线程数量过多或过少的问题;可以使用已经存在的空闲线程,避免了线程的频繁创建和销毁,从而提高了程序的性能;在任务执行结束后,空闲线程会被保留一段时间,可以处理下一次的任务请求,从而保证了系统的响应速度。
  缺点线程数是不确定的,可能会导致线程数过多,降低系统性能;线程空闲时会保留一段时间,浪费系统资源;线程数的快速变化可能会影响线程的稳定性。
  示例代码
  下面是一个CachedThreadPool线程池示例,在该示例中,我们创建了一个CachedThreadPool线程池,并将10个任务提交到线程池中执行:importjava。util。concurrent。ExecutorService;importjava。util。concurrent。Executors;publicclassCachedThreadPoolDemo{publicstaticvoidmain(String〔〕args){ExecutorServiceexecutorExecutors。newCachedThreadPool();for(inti0;i10;i){finalinttaski;executor。execute((){System。out。println(String。format(Taskdisexecutedbythreadd,task,Thread。currentThread()。getId()));});}executor。shutdown();关闭线程池}}
  运行日志讲解
  当我们运行上述示例代码时,可以看到如下的运行日志:Task0isexecutedbythread20Task1isexecutedbythread21Task2isexecutedbythread22Task3isexecutedbythread23Task4isexecutedbythread24Task6isexecutedbythread26Task8isexecutedbythread27Task7isexecutedbythread25Task9isexecutedbythread21Task5isexecutedbythread20
  从日志中可以看出,CachedThreadPool线程池中的线程数量随着任务的多寡进行自动调整,能够较快地响应请求。在任务结束后,空闲线程会被保留一段时间,以便处理下一次的任务请求。3。ScheduledThreadPool
  创建方式
  在Java中创建ScheduledThreadPool线程池时,我们需要使用Executors类提供的静态方法之一。以下是创建一个大小为3的ScheduledThreadPool线程池的示例代码:ScheduledExecutorServiceexecutorExecutors。newScheduledThreadPool(3);
  用途
  ScheduledThreadPool线程池主要用于需要延迟执行或周期性执行任务的情况。可以使用该线程池在固定时间后执行任务、定期执行任务或者在上一个任务完成后再执行下一个任务。
  优点可以延迟执行或周期性执行任务,方便对任务进行统一管理;线程数量固定,重复利用已经创建的线程,避免了线程的频繁创建和销毁,从而提高了程序的性能;可以对多个任务进行统一的管理,如设置线程池的最大任务数、最大线程数、线程空闲时间、拒绝策略等。
  缺点如果延迟时间过长或任务调度不当,可能会占用过多的系统资源,导致系统性能降低;任务执行时间过长可能会影响后续任务的执行时间。
  示例代码
  下面是一个ScheduledThreadPool线程池示例,在该示例中,我们创建了一个大小为2的ScheduledThreadPool线程池,并且分别设定了延迟1秒后执行任务和每隔2秒执行一次任务的定时器:importjava。util。concurrent。Executors;importjava。util。concurrent。ScheduledExecutorService;importjava。util。concurrent。TimeUnit;publicclassScheduledThreadPoolDemo{publicstaticvoidmain(String〔〕args){ScheduledExecutorServiceexecutorExecutors。newScheduledThreadPool(2);executor。schedule((){System。out。println(Task1isexecutedafter1seconddelay);},1,TimeUnit。SECONDS);executor。scheduleAtFixedRate((){System。out。println(Task2isexecutedevery2seconds);},0,2,TimeUnit。SECONDS);}}
  运行日志讲解
  当我们运行上述示例代码时,可以看到如下的运行日志:Task1isexecutedafter1seconddelayTask2isexecutedevery2secondsTask2isexecutedevery2secondsTask2isexecutedevery2secondsTask2isexecutedevery2secondsTask1isexecutedafter1seconddelayTask2isexecutedevery2secondsTask2isexecutedevery2secondsTask2isexecutedevery2secondsTask2isexecutedevery2seconds
  从日志中可以看出,ScheduledThreadPool线程池中的两个线程分别用来执行两个定时器中的任务。第一个定时器会延迟1秒后执行任务,而第二个定时器则是每隔2秒执行一次任务。在任务结束后,线程仍然被保留以供下一次任务使用。4。SingleThreadExecutor
  创建方式
  在Java中创建SingleThreadExecutor线程池时,我们需要使用Executors类提供的静态方法之一。以下是创建一个SingleThreadExecutor线程池的示例代码:ExecutorServiceexecutorExecutors。newSingleThreadExecutor();
  用途
  SingleThreadExecutor线程池主要用于需要按照顺序执行任务的情况。它保证所有的任务都由同一个线程依次执行,避免了多线程操作带来的竞争和锁的问题。
  优点线程数量固定,重复利用已经创建的线程,避免了线程的频繁创建和销毁,从而提高了程序的性能;所有任务由同一个线程依次执行,保证了任务执行的顺序;可以为多个任务提供同一个线程进行处理,避免了多线程操作带来的竞争和锁的问题。
  缺点只有一个线程,无法利用多核CPU的优势,可能会导致任务执行时间过长,从而降低系统性能;如果任务执行时间过长,可能会影响后续任务的执行时间。
  示例代码
  下面是一个SingleThreadExecutor线程池示例,在该示例中,我们创建了一个SingleThreadExecutor线程池,并将10个任务提交到线程池中执行:importjava。util。concurrent。ExecutorService;importjava。util。concurrent。Executors;publicclassSingleThreadExecutorDemo{publicstaticvoidmain(String〔〕args){ExecutorServiceexecutorExecutors。newSingleThreadExecutor();for(inti0;i10;i){finalinttaski;executor。execute((){System。out。println(String。format(Taskdisexecutedbythreadd,task,Thread。currentThread()。getId()));});}executor。shutdown();关闭线程池}}
  运行日志讲解
  当我们运行上述示例代码时,可以看到如下的运行日志:Task0isexecutedbythread20Task1isexecutedbythread20Task2isexecutedbythread20Task3isexecutedbythread20Task4isexecutedbythread20Task5isexecutedbythread20Task6isexecutedbythread20Task7isexecutedbythread20Task8isexecutedbythread20Task9isexecutedbythread20
  从日志中可以看出,SingleThreadExecutor线程池中只有一个线程用来执行任务,并且所有任务都由同一个线程依次执行。5。WorkStealingPool
  创建方式
  在Java中创建WorkStealingPool线程池时,我们需要使用Executors类提供的静态方法之一。以下是创建一个WorkStealingPool线程池的示例代码:ExecutorServiceexecutorExecutors。newWorkStealingPool();
  用途
  WorkStealingPool线程池主要用于处理大量独立任务的情况。该线程池会自动将任务分配给空闲的线程执行,同时可以根据需要增加或减少线程数以适应当前的工作负载。
  优点可以根据需要增加或减少线程数,自适应地处理工作负载;采用workstealing算法,可以提高CPU利用率,避免线程因等待而浪费时间;可以处理大量独立任务,提高程序性能。
  缺点线程没有固定的顺序,可能会导致较长的等待时间;线程数量不易控制,可能导致系统负载过高。
  示例代码
  下面是一个WorkStealingPool线程池示例,在该示例中,我们创建了一个WorkStealingPool线程池,并将10个任务提交到线程池中执行:importjava。util。concurrent。ExecutorService;importjava。util。concurrent。Executors;publicclassWorkStealingPoolDemo{publicstaticvoidmain(String〔〕args){ExecutorServiceexecutorExecutors。newWorkStealingPool();for(inti0;i10;i){finalinttaski;executor。execute((){System。out。println(String。format(Taskdisexecutedbythreadd,task,Thread。currentThread()。getId()));});}executor。shutdown();关闭线程池}}
  运行日志讲解
  当我们运行上述示例代码时,可以看到如下的运行日志:Task7isexecutedbythread14Task4isexecutedbythread14Task8isexecutedbythread12Task1isexecutedbythread15Task9isexecutedbythread12Task6isexecutedbythread15Task3isexecutedbythread12Task2isexecutedbythread13Task5isexecutedbythread13Task0isexecutedbythread14
  从日志中可以看出,WorkStealingPool线程池会自动将任务分配给空闲的线程执行,并且每次执行的顺序是不确定的。6。ForkJoinPool
  创建方式
  在Java中创建ForkJoinPool线程池时,我们需要使用ForkJoinPool类提供的构造方法之一。以下是创建一个ForkJoinPool线程池的示例代码:ForkJoinPoolforkJoinPoolnewForkJoinPool();
  用途
  ForkJoinPool线程池主要用于处理大量并行任务的情况。它使用分治算法将任务拆分成多个小任务,同时利用工作窃取(workstealing)算法提高CPU利用率。
  优点可以处理大量并行任务,提高程序性能;采用分治算法和工作窃取算法,可以充分利用CPU,提高系统性能;可以根据需要增加或减少线程数,自适应地处理工作负载。
  缺点线程没有固定的顺序,可能会导致较长的等待时间;处理任务的过程相对复杂,可能会对系统带来一定的开销。
  示例代码
  下面是一个ForkJoinPool线程池示例,在该示例中,我们创建了一个ForkJoinPool线程池,并使用分治算法将任务拆分成多个小任务。最终,所有任务都将由线程池中的线程执行:importjava。util。concurrent。ForkJoinPool;importjava。util。concurrent。RecursiveAction;publicclassForkJoinPoolDemo{publicstaticvoidmain(String〔〕args){ForkJoinPoolforkJoinPoolnewForkJoinPool();forkJoinPool。invoke(newMyTask(0,10));forkJoinPool。shutdown();关闭线程池}}classMyTaskextendsRecursiveAction{privateintstart;privateintend;publicMyTask(intstart,intend){this。startstart;this。endend;}Overrideprotectedvoidcompute(){if(endstart2){如果任务量小于2,直接执行任务System。out。println(String。format(Taskdisexecutedbythreadd,start,Thread。currentThread()。getId()));return;}否则将任务拆分成两个子任务,交给其他线程执行intmiddle(startend)2;MyTaskleftnewMyTask(start,middle);MyTaskrightnewMyTask(middle,end);left。fork();right。fork();}}
  运行日志讲解
  当我们运行上述示例代码时,可以看到如下的运行日志:Task0isexecutedbythread14Task9isexecutedbythread13Task8isexecutedbythread14Task7isexecutedbythread13Task6isexecutedbythread14Task5isexecutedbythread13Task4isexecutedbythread13Task3isexecutedbythread14Task2isexecutedbythread13Task1isexecutedbythread14
  从日志中可以看出,ForkJoinPool线程池使用分治算法将任务拆分成两个子任务,其中一些子任务可能会由其他线程执行。最终,所有任务都将由线程池中的线程执行。7。SingleThreadScheduledExecutor
  创建方式
  在Java中创建SingleThreadScheduledExecutor线程池时,我们需要使用Executors类提供的newSingleThreadScheduledExecutor()方法。以下是创建一个SingleThreadScheduledExecutor线程池的示例代码:ScheduledExecutorServiceexecutorExecutors。newSingleThreadScheduledExecutor();
  用途
  SingleThreadScheduledExecutor线程池主要用于需要定期执行任务的情况。它会按照指定的时间间隔重复执行任务,且所有任务都由单个线程顺序执行。
  优点所有任务都由单个线程顺序执行,避免了多线程带来的竞争问题;可以按照指定的时间间隔重复执行任务。
  缺点只有一个线程执行任务,可能会影响程序性能。
  示例代码
  下面是一个SingleThreadScheduledExecutor线程池示例,在该示例中,我们创建了一个SingleThreadScheduledExecutor线程池,并提交多个定时任务。所有任务都将由单个线程顺序执行:importjava。util。concurrent。Executors;importjava。util。concurrent。ScheduledExecutorService;importjava。util。concurrent。TimeUnit;publicclassSingleThreadScheduledExecutorDemo{publicstaticvoidmain(String〔〕args){ScheduledExecutorServiceexecutorExecutors。newSingleThreadScheduledExecutor();executor。scheduleAtFixedRate(newRunnable(){Overridepublicvoidrun(){System。out。println(Task1isexecutedbythreadThread。currentThread()。getId());}},0,1,TimeUnit。SECONDS);executor。scheduleAtFixedRate(newRunnable(){Overridepublicvoidrun(){System。out。println(Task2isexecutedbythreadThread。currentThread()。getId());}},0,2,TimeUnit。SECONDS);executor。shutdown();关闭线程池}}
  运行日志讲解
  当我们运行上述示例代码时,可以看到如下的运行日志:Task1isexecutedbythread17Task2isexecutedbythread17Task1isexecutedbythread17Task1isexecutedbythread17Task2isexecutedbythread17Task1isexecutedbythread17Task1isexecutedbythread17Task2isexecutedbythread17Task1isexecutedbythread17。。。
  从日志中可以看出,SingleThreadScheduledExecutor线程池按照指定的时间间隔重复执行任务,并且所有任务都由单个线程顺序执行。
  想了解ThreadPoolExecutor的更多东西,请点击本人的另一篇文章:
  Java多线程:玩转ThreadPoolExecutor线程池必须知道这几点

联合文件来了电信联通合并一张网中国电信、中国联通共建一张网文件下来了!在中国电信2022年中期业绩说明会上,中国电信董事长柯瑞文表示,将重点加速推进室内4G共享,计划与中国联通三年完成4G一张网整合。……扫地机器人十大排名,扫拖一体机排名什么牌子好介绍扫地机器人十大排名,冰尊扫地机器人名列前茅!作为智能家居领域的典型代表,扫拖一体机扫地机器人自从面世以来一直深受广大消费者的喜爱。经过多年的创新和发展,扫拖一体机扫地机器人日臻……你以为你在玩游戏?其实是算法在玩你图片来源视觉中国文智商税研究中心每当你想放弃一个手机游戏的时候,它都会非常精准的给你一点甜头,让你继续玩下去。算法,现在已经无处不在,除了短视频和电商行业普遍……教师节最美贺卡唯美文字祝福,送给恩师菊香浓浓,师恩深,匆匆的岁月从指间划过,斑白了老师您双鬓的青丝。桃李天下,是您最欣慰的表达,也是您最宏大的梦想。在这个属于您的日子里,学生给您送上深深的祝福,也许您已把我忘却,……世界田联官宣,苏炳添短跑世界冠军梦想宣告破灭,或带着遗憾退役在中国田径界,有两大飞人足以载入亚洲田径史册。一是飞人刘翔,他在110米栏创造的成绩,是亚洲田径运动员的天花板。另外一个则是被称为亚洲飞人的苏炳添,他在男子百米跑道上创造了亚洲……柳传志进小学教材,为什么教材问题屡禁不止?我是雾雨,点击上方关注,每天为你分享自媒体运营与个人精进干货。雾雨的小屋升级后,分为三个专栏,一个是从零开始的自媒体系列,意在分享一些自媒体、副业干货,还有一个从零开始的……和聊得来的人交往,和睡得来的人结婚(随笔)文李固国图片来自网络人活着,短短几十年,还要说没有突如其来的灾祸,更没有所谓的阴曹地府或来生,真的应该好好珍惜。很多时候,我们不是为自己而活,为了面子,为了人情,为……有哪些淳朴自然表达喜欢的句子1、我一生都是坚定不移的唯物主义者,唯有你,我希望有来生周恩来2、今天天气好好,我们见个面一起吃个饭吧3、月亮正亮的起劲,若此刻不想你,倒显得我不解风情。4、……房价未来几年真的会像马云说的那样跌到白菜价吗?有多少人认为未来十年八年内房价必然会大跌?就像之前马云预测的那样,未来的房子都是白菜价。现在国家为了避免因房价大跌导致全国系统性的债务风险,地方政府又为了能再靠卖地来苟延……热搜!星汉灿烂母女关系惹争议,网友纷纷吐槽令人窒息万万没想到,热播古偶剧《星汉灿烂》里能看到令人窒息的中国式母女关系。本是去追靓男美女甜甜的爱情,大家却被剧中女主的妈妈萧元漪对女主程少商的态度气得不轻。女主程少商被……但凡你的股票出现以下特征,散户要看清楚了,这是洗盘而不是出货古时军事家作战讲究知己知彼,百战不殆。散户投资者若想达到成功猎庄的目的,首先要对庄家有个深入且细致的了解,通晓庄家的优势,明了庄家的劣势。坐庄过程中,庄家的招数往往虚虚实实、忽……范志毅女儿回国读研!却因英国国籍引争议,与大7岁土豪男友分手范志毅是我国著名足球运动员,当年帮助中国男足打进世界杯,被球迷们称为范大将军。范志毅已经退役很多年了,但他始终没有离开人们的视线,甚至比过去更加出名了。让范志毅走红的主要原因是……
云南通海五山村成为全省首个盆景村日前,云南省盆景赏石协会授予玉溪市通海县里山乡五山村云南盆景村荣誉称号,也是目前全省唯一一个省级盆景村。很早以前,五山村因地理优势,时常有村民上山寻找一些有寓意的植物回家……图怎么给绿萝换盆方法是个大学问现在社会,绿萝作为绿化空间、净化空气的较理想盆栽植物,我们对它已不在陌生。大部分人都知道绿萝该怎么养,但对于换盆却非常陌生。对此,在这里教大家如何给绿萝换盆。绿萝这种植物……易建联可能退役,联合腾讯打造易体育,从底层建立篮球文化众所周知,今年广东宏远无缘打进总决赛。而易建联的表现也不太好。不管什么原因,广东宏远很大机会会进行比较大的人员调动。广东宏远作为一家民营企业管理的球队,母公司在现在这个情……图怎么识别金桂花树花色株型是重点桂花是木犀科常绿灌木或小乔木,质坚皮薄,叶长椭圆形面端尖,经冬不凋。其园艺品种繁多,分为金桂、银桂、丹桂、月桂等。那么如何去辨别金桂花树呢?每年一到了八月份快要结束的时候……喝茶对银屑病患者的好处竟然有这么多一说起银屑病,大家一定都对其的危害性有了些许的了解。银屑病是一种慢性的皮肤疾病,大家在患病后一定要及时治疗,如果不能及时治疗的话那么很容易造成症状的加重,甚至还可严重影响到患者……图月季叶子卷曲的原因这三点一定要注意在生活之中,很多花友都会发现月季的叶片出现卷曲的情况。有的时候新长出的嫩叶也会卷曲,而有时候老叶片的叶缘也会卷曲,严重的话叶片还会发黄,它的原因是什么呢?很多喜爱自己在家……图值得分享的德牧训练教程三个方法帮你教出好狗德国牧羊犬长相威猛、行动敏捷,很多时候的身份是工作犬。现如今,也有很多人饲养德国牧羊犬作为宠物犬、观赏犬等。训练德牧需要对其进行适当的训练,这样狗狗才能更听话。德牧是一种……图叶子很硬像冬青的植物这样的树种你见过吗叶子很硬像冬青一样的植物有多,它们都是硬叶,这是为了防止水分流失而自我保护的一种方法,这种树木往往四季都是青的,例如四季青,今天小编就给大家介一下它们吧。一、叶子很硬的植……图边境牧羊犬好吗生手饲养要注意三方面边境牧羊犬智商排名位居首位,相当于6岁儿童的智商。边境牧羊犬有非常匀称体型,外观健壮而且肌肉发达。它们外形优雅,给人的印象比较好,是一种深受人们欢迎的狗狗。边牧是特别聪明……图令人着迷的云南兰花姜氏荷这样的花你见过吗云南兰花姜氏荷,大家听到这个名字的时候一定也会感到有疑问,这个花到底是属于兰花种的品种还是属于荷花的品种呢?下面就让小编带大家去探寻姜氏荷的秘密。一、姜氏荷的生长习性及外……图罗威纳犬爱攻击人吗全面分析让你正确认识它们罗威纳犬是一种烈性犬,因为体型巨大而且性格刚烈,所以很容易发生伤人事件。这种狗的来源让大家非常疑惑,说法也不太统一。那么,它们的性格特点是什么样的呢?一、攻击性。现……图紫玉兰花的寓意是什么如何管理才得当紫玉兰是中国特有的植物,它开出来的花朵非常艳丽,有着淡淡的芳香和婀娜的树形,不论是丛植还是孤植都是很美观的。种植紫玉兰花有着怎样的寓意呢?一起来看看吧!紫玉兰花是很珍贵的……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网