欢迎来到天天文库
浏览记录
ID:43282079
大小:90.00 KB
页数:5页
时间:2019-09-28
《线程池拒绝策略》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、ThreadPoolExecutor类实现了ExecutorService接口和Executor接口,可以设置线程池corePoolSize,最大线程池大小,AliveTime,拒绝策略等。常用构造方法:ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueworkQueue,RejectedExecutionHandlerhandler)
2、corePoolSize:线程池维护线程的最少数量maximumPoolSize:线程池维护线程的最大数量keepAliveTime:线程池维护线程所允许的空闲时间unit:线程池维护线程所允许的空闲时间的单位workQueue:线程池所使用的缓冲队列handler:线程池对拒绝任务的处理策略当一个任务通过execute(Runnable)方法欲添加到线程池时:l如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。2如果此时线程池
3、中的数量等于corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列。3如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。4如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePool
4、Size、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。handler有四个选择:5ThreadPoolExecutor.AbortPolicy()抛出java.util.concurrent.RejectedExecutionException异常,示例如下:privat
5、estaticclassWorkerimplementsRunnable{publicvoidrun(){System.out.println(Thread.currentThread().getName()+"isrunning");}}publicstaticvoidmain(String[]args){intcorePoolSize=5;intmaxPoolSize=10;longkeepAliveTime=5;BlockingQueuequeue=newLinkedBlo
6、ckingQueue(10);//拒绝策略1:将抛出RejectedExecutionException.RejectedExecutionHandlerhandler=newThreadPoolExecutor.AbortPolicy();ThreadPoolExecutorexecutor=newThreadPoolExecutor(corePoolSize,maxPoolSize,5keepAliveTime,TimeUnit.SECONDS,queue,handler);
7、for(inti=0;i<100;i++){executor.execute(newWorker());}executor.shutdown();}运行结果如下:pool-1-thread-2isrunningpool-1-thread-3isrunningExceptioninthread"main"java.util.concurrent.RejectedExecutionExceptionpool-1-thread-1isrunningpool-1-thread-7isrunningpool-
8、1-thread-6isrunningpool-1-thread-4isrunningpool-1-thread-9isrunningpool-1-thread-8isrunningpool-1-thread-5isrunningatjava.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1760)atjava.util.concurre
此文档下载收益归作者所有