多线程并发处理出来一般非常麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了。spring封装了java的多线程的实现spring 多线程,你只应该关注于并发事物的流程或者一些并发负载量等特点。具体来说如何使用spring来处理并发事务:
首先编写详细的事务逻辑,实现Runnable接口,比如说
package com.andy.threadDemo;
public class ThreadTransCode
implements Runnable{
@Override
public void run() {
System.out.println("执行事务");
}
}
然后要做的就是配置spring容器原本提供的线程池任务执行器:
<bean
id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property
name="corePoolSize"
value="3"
/>
<property
name="keepAliveSeconds"
value="200"
/>
<property
name="maxPoolSize"
value="5"
/>
<property
name="queueCapacity"
value="25"
/>
</bean>
配置过程中主要关注于四个属性的配置
接下来要做的事就是在应用平台原本的业务bean中使用线程池任务执行器来执行并发事务。
在对应的业务bean中注入线程池任务执行器,像普通的spring bean一样。
<bean
id="bizManager"
class="com.andy.threadDemo.BizManager"
>
<property
name="taskExecutor">
<ref
bean="taskExecutor"
/>
</property>
</bean>
在业务代码中,通常以for循环的方法执行多个事务
for(int k = 0; k < n; k++) {
taskExecutor.execute(new ThreadTransCode());
}
其它繁琐的线程管理的事情就交给执行器去管理。
值得注意的事有两点
1, taskExecutor.execute(newThreadTransCode()); 激活的线程都是守护线程,主线程结束,守护线程都会抛弃执行,这个在业务中式符合逻辑的,在单元测试中为了发现执行效果,需要自行阻塞主线程。
2,taskExecutor.execute(newThreadTransCode()); 的执行也不是完全安全的spring 多线程,在执行的过程中可能会因为必须的线程查过了线程队列的容量而抛出运行时异常,如有必要需要捕获。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-136266-1.html
人
现阶段美国作为一个正在衰落的超级大国他的内心是失落的