<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <!-- 异步线程池 -->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 核心线程数 -->
<property name="corePoolSize" value="8" />
<!-- 最大线程数 -->
<property name="maxPoolSize" value="100" />
<!-- 队列最大长度 >=mainExecutor.maxSize -->
<property name="queueCapacity" value="0" />
<!-- 线程池维护线程所允许的空闲时间 -->
<property name="keepAliveSeconds" value="500" />
<!-- 线程池对拒绝任务(无线程可用)的处理策略 -->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
</property>
</bean> </beans>
public class MyCallable implements Callable<String> {
private String name;
public MyCallable(String name){
this.name=name;
}
@Override
public String call() throws Exception {
Thread.sleep(5000);
return name;
}
}
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; public class threadPoolTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) ctx.getBean("taskExecutor");
CompletionService<String> cs = new ExecutorCompletionService<>(taskExecutor);
for (int i = 0; i < 5; i++) {
cs.submit(new MyCallable("Thread "+i));
}
for (int i = 0; i < 5; i++){
try {
System.out.println(cs.take().get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
}
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext1.xml");
ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) ctx.getBean("taskExecutor");
List<Future<String>> list = new ArrayList<Future<String>>(); for (int i = 0; i < 5; i++) {
Future<String> future= taskExecutor.submit(new MyCallable("Thread "+i));
list.add(future);
}
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Future<String> future = (Future<String>) iterator.next();
try {
System.out.println(future.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
iterator.remove();
}
System.out.println(list.size());
}

queueCapacity参数是0的话,用的是SynchronousQueue,否则是LinkedBlockingQueue。
用CallerRunsPolicy策略的话,线程超过最大数量和队列长度之和,主线程等待,直到线程池有空闲线程。

最新文章

  1. Android开发之应用程序的安装
  2. T-Sql(二)事务(Transaction)
  3. CSS中定位和浮动对行内元素的宽高的影响
  4. Array.splice()理解记忆
  5. MySQL 语句大全--------添加列,修改列,删除列
  6. docker-6 管理工具
  7. WEBAPI 怎么保证安全
  8. Yii源码阅读笔记(二十三)
  9. [麦先生]LINUX常用命令总结
  10. Flash图表控件FusionCharts如何在图表中显示标识和图片
  11. excel VLOOKUP函数的用法
  12. Spring集成Hessian
  13. ant 具体命令行展示代码
  14. c#左右socket连接超时控制方案
  15. ORACLE ROWNUM解析
  16. 阿里云RDS for SQL Server使用的一些最佳实践
  17. RPC详解
  18. Codeforces 1091E New Year and the Acquaintance Estimation [图论]
  19. [oracle] oracle-ibatis-整理
  20. python 之ConfigParser模块学习

热门文章

  1. bzoj 3881: [Coci2015]Divljak AC自动机
  2. HBase的bulkLoad
  3. BZOJ1720:[Usaco2006 Jan]Corral the Cows 奶牛围栏
  4. asp.net中日志框架Log4Net的使用
  5. windows7下安装gem包---bcrypt-ruby
  6. Python函数式编程(把函数作为参数传入)
  7. ORM查询相关
  8. etcd命令
  9. 【总结整理】关于Json的解析,校验和验证
  10. JDBC编程之数据更新