spring动态线程池(实质还是用了java的线程池)
2024-08-29 01:52:00
<?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策略的话,线程超过最大数量和队列长度之和,主线程等待,直到线程池有空闲线程。
最新文章
- Android开发之应用程序的安装
- T-Sql(二)事务(Transaction)
- CSS中定位和浮动对行内元素的宽高的影响
- Array.splice()理解记忆
- MySQL 语句大全--------添加列,修改列,删除列
- docker-6 管理工具
- WEBAPI 怎么保证安全
- Yii源码阅读笔记(二十三)
- [麦先生]LINUX常用命令总结
- Flash图表控件FusionCharts如何在图表中显示标识和图片
- excel VLOOKUP函数的用法
- Spring集成Hessian
- ant 具体命令行展示代码
- c#左右socket连接超时控制方案
- ORACLE ROWNUM解析
- 阿里云RDS for SQL Server使用的一些最佳实践
- RPC详解
- Codeforces 1091E New Year and the Acquaintance Estimation [图论]
- [oracle] oracle-ibatis-整理
- python 之ConfigParser模块学习