多線程並發處理起來通常比較麻煩,假設你使用spring容器來管理業務bean,事情就好辦了多了。spring封裝了java的多線程的實現,你僅僅須要關注於並發事物的流程以及一些並發負載量等特性。
詳細來說怎樣使用spring來處理並發事務:
首先編寫詳細的事務邏輯,實現Runnable接口。比方說
package com.andy.threadDemo;
public class ThreadTransCode implements Runnable{
@Override
public void run() {
System.out.println( "運行事務");
}
}
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 >
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>
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());
}
taskExecutor.execute(new ThreadTransCode());
}
其他繁瑣的線程管理的事情就交給運行器去管理。
值得注意的事有兩點
1, taskExecutor.execute(new ThreadTransCode()); 激活的線程都是守護線程,主線程結束,守護線程就會放棄運行,這個在業務中式符合邏輯的。在單元測試中為了看到運行效果,須要自行堵塞主線程。
2, taskExecutor.execute(new ThreadTransCode()); 的運行也不是全然安全的。在運行的過程中可能會由於須要的線程查過了線程隊列的容量而拋出運行時異常,如有必要須要捕獲。