在applicationContext.xml中配置 <!--==========线程池配置开始======================--> <bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 核心线程数,默认为1 --> <property name="corePoolSize" value="8" /> <!-- 最大线程数,默认为Integer.MAX_VALUE --> <property name="maxPoolSize" value="10" /> <!-- 队列最大长度,一般需要设置值>=notifyScheduledMainExecutor.maxNum;默认为Integer.MAX_VALUE--> <property name="queueCapacity" value="200" /> <!-- 线程池维护线程所允许的空闲时间,默认为60s --> <property name="keepAliveSeconds" value="300" /> <!-- 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者 --> <property name="rejectedExecutionHandler"> <!-- AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常 --> <!-- CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 --> <!-- DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 --> <!-- DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 --> <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy" /> <!--<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />--> </property> </bean> 测试代码 ApplicationContext ac = new ClassPathXmlApplicationContext("config/spring/applicationContext-mini.xml"); ThreadPoolTaskExecutor threadPoolTaskExecutor=(ThreadPoolTaskExecutor)ac.getBean("threadPoolTaskExecutor"); for (int i = 1; i <= 11; i++) { String d= DateTimeUtil.getNowDate4(); System.out.println("第"+i+"个任务开始执行#"+d); threadPoolTaskExecutor.execute(new Runnable() { public void run() { String d1= DateTimeUtil.getNowDate4(); //这里编写处理业务代码 String msg= RedisUtil.lpop("test0714"); System.out.println("##########"+msg+"任务处理中……"+d1); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }); } corePoolSize、maxPoolSize、queueCapacity三者关系 corePoolSize核心线程数,系统一次最多启动几个线程来运行 maxPoolSize 最大线程数,系统最多可以运行几个线程来运行 queueCapacity 缓冲队列数,系统最多可以缓冲多少个线程数 举例: corePoolSize=8;maxPoolSize=10;queueCapacity=20; 加入现在线程池中都是空闲的 一次并发了40个请求过来 调用threadPoolTaskExecutor.execute时,则有8个线程并行执行,剩余32个进入到 queueCapacity队列中,但是缓冲队列只能缓冲20个,这时最大线程数还有两个名额, 会再创建2个线程来执行请求。 此时一共可以处理的请求=8+20+2=30个请求 当corePoolSize中的线程处理完毕后,会从queueCapacity队列中拿出新的处理需求进入到 corePoolSize中。
spring线程池
猜你喜欢
转载自wuhen639.iteye.com/blog/2311971
今日推荐
周排行