spring提供了线程池的支持
查看基本 Java线程池
先是一个线程 ThreadTransCode.java
packagecom.enorth.lichen.transcode;
publicclassThreadTransCodeimplementsRunnable{
@Override
publicvoidrun() {
System.out.println("转码开始..............");
}
}
publicclassThreadTransCodeimplementsRunnable{
@Override
publicvoidrun() {
System.out.println("转码开始..............");
}
}
在spring配置文件中添加线程池的配置信息
<beanid="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<propertyname="corePoolSize"value="3"/>
<propertyname="keepAliveSeconds"value="200"/>
<propertyname="maxPoolSize"value="5"/>
<propertyname="queueCapacity"value="25"/>
</bean>
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<propertyname="corePoolSize"value="3"/>
<propertyname="keepAliveSeconds"value="200"/>
<propertyname="maxPoolSize"value="5"/>
<propertyname="queueCapacity"value="25"/>
</bean>
在action中添加注入
<beanid="saveVideoAction"
class="com.enorth.lichen.action.video.SaveVideoAction"
scope="prototype">
<propertyname="videoService">
<refbean="videoService"/>
</property>
<propertyname="groupService">
<refbean="groupService"/>
</property>
<propertyname="taskExecutor">
<refbean="taskExecutor"/>
</property>
</bean>
class="com.enorth.lichen.action.video.SaveVideoAction"
scope="prototype">
<propertyname="videoService">
<refbean="videoService"/>
</property>
<propertyname="groupService">
<refbean="groupService"/>
</property>
<propertyname="taskExecutor">
<refbean="taskExecutor"/>
</property>
</bean>
在action中调用
privateTaskExecutor taskExecutor;
publicTaskExecutor getTaskExecutor() {
returntaskExecutor;
}
publicvoidsetTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
publicString execute()throwsException {
publicTaskExecutor getTaskExecutor() {
returntaskExecutor;
}
publicvoidsetTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
publicString execute()throwsException {
for(intk = 0; k < 2; k++) {
taskExecutor.execute(newThreadTransCode());
}
returnSUCCESS;
}
以上就可以用spring实现java线程池的使用...
遗憾的是, 我在用线程池执行flv的转码线程时, 发现只有停掉tomcat才能自动执行转码的操作, 其他简单操作的多线程都是可以的. 原因不明, 难道转码的线程太耗资源?
日日日.问题解决了.原因是死锁...实际转码的线程在tomcat停掉后就能自动运行已经说明了,我日竟然没注意...
线程池 ThreadPool.java
publicstaticExecutorService exec = Executors.newFixedThreadPool(1);
publicstaticsynchronizedvoidtrans(String videoPath,String targetPath){
ThreadTransCode trans=newThreadTransCode(videoPath,targetPath);
exec.execute(trans);
}
publicstaticsynchronizedvoidtrans(String videoPath,String targetPath){
ThreadTransCode trans=newThreadTransCode(videoPath,targetPath);
exec.execute(trans);
}
转载于:https://blog.51cto.com/lichen/162057