线程池的几种拒绝策略及其应用场景,线程池 拒绝
00-1010预先配置线程池。创建线程任务拒绝策略I :AbortPolicy拒绝策略II:caller run Policy拒绝策略III: DiscardPolicy拒绝策略IV: DiscardOldestPolicy摘要DK版本dk1.5增加了JUC和契约,其中一个包含线程池。
四种拒绝策略:
拒绝策略类型1 Threadpooleuxecutor的描述。AbortPolicy默认拒绝策略,拒绝任务并抛出task 2 Threadpooleuxecutor。CallerrorsPolicy使用调用线程直接运行task 3 Threadpooleuxecutor。DiscardPolicy直接拒绝任务,不抛出错误4线程池执行器。DiscardOldestPolicy触发拒绝策略。只要有新任务,阻塞队列的最老的任务将总是被丢弃,而新任务将被添加。
目录
00-1010核心线程和最大线程都要设置得尽可能小,分别设置为1和2个阻塞队列,并设置固定长度的有界队列。长度为1的线程工厂设置默认线程工厂。//核心线程数intcorepower size=1;//最大线程数int maximumPoolSize=2;//线程生存期长keepAliveTime=10//线程生存期单位TimeUnit unit=TimeUnit。秒;//有界队列遵循FIFO原则blockingqueuerunnable工作队列=new arrayblockingqueue(1);//线程工厂Thread factory Thread factory=executors . default Thread factory();
00-1010创建一个线程任务,一个线程任务执行一秒:
类TaskThread实现Runnable { private int I;public task thread(int I){ this . I=I;} @ override public void run(){ try { time unit。seconds . sleep(2);System.out.println(执行任务3360 I);} catch(interrupted exception e){ e . printstacktrace();}}}
00-1010默认拒绝策略,拒绝任务,抛出任务。
//拒绝策略默认的拒绝策略拒绝任务并抛出异常:rejectedexecutionhandler handler=newthreadpooleuxecutor . abort policy();ThreadPoolExecutor threadPool=new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler);for(int I=1;I=5;I){ try { thread pool . execute(new task thread(I));} catch(exception e){ system . out . println([task I ]报错: e . getmessage());}}输出
[Task] 4错误: Task com . test . controller . threadpoolcontroller $ Task thread @ 5c 0369 C4被Java . util . concurrent . threadpooleuxecutor @ 50675690[正在运行,池大小=2,活动线程=2,排队任务=1,已完成任务=0] [Task] 5错误: Task com . test . controller . threadpoolcontroller $ Task thread @ 31 b 7 dea0被Java . util . concurrent . threadpooleuxecutor @ 506750
阻塞队列的最大线程数=3,当达到4或5时将抛出错误。您需要在这里用try catch捕获异常。任务1、2和3正常执行。
如果所有提交的任务都必须执行,可以将抛出的错误任务保存在redis中,然后定期从redis中获取任务,再提交执行。
00-1010调用线程运行冗余任务。
更改拒绝策略,并将上面的AbortPolicy更改为CallerRunsPolicy。
RejectedExecutionHandler handler=new thread pool executor。caller run policy();执行任务,输出:
执行任务:1执行任务33604执行任务33603执行任务33602执行任务33605
阻塞队列的最大线程数=3,冗余任务继续执行。
00-1010拒绝任务,不抛出错误。更改策略,并将CallerRunsPolicy更改为DiscardPolicy:
RejectedExecutionHandler handler=new thread pool executor。丢弃策略();执行任务,输出:
执行任务:1执行任务33603执行任务33602
全屏制作文件副本
冗余线程任务提交被拒绝,但只会执行阻塞队列的线程数最大的任务,不会抛出错误。
00-1010只要有新任务,阻塞队列中最旧的任务总是会被丢弃,新任务会被添加到阻塞队列中。更改策略,并将DiscardOldestPolicy更改为DiscardOldestPolicy:
RejectedExecutionHandler handler 3=new threadpool executor。DiscardOldestPolicy();执行任务,输出:
执行任务:3执行任务33601执行任务33605
任务的执行顺序是核心线程数-阻塞队列-最大线程数,其中任务1和任务3提交成功。
任务2因为在阻塞队列中,后面的任务4挤走了任务2,任务5挤走了任务4,所以最后一个是任务5。
00-1010本文介绍了线程的四种拒绝策略。当工作任务大于最大线程阻塞队列时,将执行阻塞队列。
AbortPolicy是默认策略,它拒绝任务并引发异常。CallerRunsPolicy调用线程执行任务。DiscardPolicy拒绝该任务,并且不抛出异常。DiscardOldestPolicy有冗余任务,丢弃阻塞队列的最旧任务,将其放入新任务中,直到没有新任务为止。关于Java线程池的四种拒绝策略的这篇文章到此为止。有关Java线程池拒绝策略的更多信息,请搜索热门IT以前的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。