第一步:
spring进行线程池的配置
<bean id="newDis"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" /> <!-- 并发线程数,想达到真正的并发效果,最好对应CPU的线程数及核心数 -->
<property name="keepAliveSeconds" value="300" /> <!--线程池维护线程所允许的空闲时间-->
<property name="maxPoolSize" value="500" /> <!-- 最大线程池容量 -->
<property name="queueCapacity" value="50" /> <!-- 超过最大线程池容量后,允许的线程队列数 -->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
</property>
</bean>
第二步:
获取newDis这个bean开启线程
//countDownLatch是jdk自带的封装的同步方法,参数为开启线程的数量大小
final CountDownLatch countDownLatch=new CountDownLatch(lists.size());
for(final List<String> list:lists){
//开启线程
threadPoolTaskExecutor = ApplicationContextUtil.getBean("newDis", ThreadPoolTaskExecutor.class);
threadPoolTaskExecutor.execute(new Runnable() {
//解决多线程操作同一集合
@Override
public void run() {
System.out.println("--子线程--");
try {
//模拟业务代码
Thread.sleep(2000);
}catch (Exception e){
}finally {
countDownLatch.countDown();//工人完成工作,计数器减一
}
}
});
}
try {
//等待子线程全部结束
countDownLatch.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("-------------主线程执行---------------");