一、概述
Spring通过ThreadPoolTaskExecutor实现线程池技术,它是使用jdk中的Java.util.concurrent.ThreadPoolExecutor进行实现。
1.1、xml方式配置
<!-- Spring线程池 --> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 核心线程数 --> <property name="corePoolSize" value="5" /> <!-- 线程池维护线程的最大数量 --> <property name="maxPoolSize" value="10" /> <!-- 允许的空闲时间, 默认60秒 --> <property name="keepAliveSeconds" value="60" /> <!-- 任务队列 --> <property name="queueCapacity" value="50" /> <!-- 线程超过空闲时间限制,均会退出直到线程数量为0 --> <property name="allowCoreThreadTimeOut" value="true"/> <!-- 对拒绝task的处理策略 --> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy" /> </property> </bean>
java代码
//帮我们创建容器 @RunWith(SpringJUnit4ClassRunner.class) //指定创建容器时使用哪个配置文件 @ContextConfiguration("classpath:applicationContext.xml") public class SpringThreadPoolExecutorTest { @Autowired private ThreadPoolTaskExecutor taskExecutor; @Test public void newFixedThreadPoolTestSubmit() throws Exception { List<Future<?>> list=new ArrayList<>(); for (int i = 0; i < 20; i++) { Future<?> submit = taskExecutor.submit(new DataTask("ssss" + i)); list.add(submit); } for (Future<?> future : list) { future.get(); } } class DataTask implements Runnable { private String a; public DataTask(String a) { this.a = a; } @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("-------"+ LocalDateTime.now()+a); } } }
输出
-------2019-08-06T21:23:18.105ssss0 -------2019-08-06T21:23:18.105ssss3 -------2019-08-06T21:23:18.105ssss1 -------2019-08-06T21:23:18.105ssss2 -------2019-08-06T21:23:18.105ssss4 -------2019-08-06T21:23:19.110ssss8 -------2019-08-06T21:23:19.110ssss6 -------2019-08-06T21:23:19.110ssss5 -------2019-08-06T21:23:19.110ssss7 -------2019-08-06T21:23:19.110ssss9 -------2019-08-06T21:23:20.113ssss10 -------2019-08-06T21:23:20.113ssss12 -------2019-08-06T21:23:20.113ssss13 -------2019-08-06T21:23:20.113ssss11 -------2019-08-06T21:23:20.113ssss14 -------2019-08-06T21:23:21.117ssss18 -------2019-08-06T21:23:21.117ssss16 -------2019-08-06T21:23:21.117ssss17 -------2019-08-06T21:23:21.117ssss15 -------2019-08-06T21:23:21.117ssss19