定义一个job:ranJob,设置每秒执行一次,设置不容许覆盖并发执行java
<bean id="rankJob" class="com.chinacache.www.logstat.job.RankJob" /> <bean id="rankJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="rankJob" /> <property name="targetMethod" value="execute" /> <property name="concurrent" value="false" /> </bean> <bean id="rankJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="rankJobDetail" /> <!-- 单位 ms,半小时 1800000 ms --> <property name="repeatInterval" value="1000 /> </bean>
java 代码spring
public void execute() throws InterruptedException { System.out.println("Start job"); ExecutorService exec = Executors.newFixedThreadPool(1); Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("thread start"); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("thread end"); } }); exec.execute(thread); exec.shutdown(); while (!exec.isTerminated()) { // 等待全部子线程结束,才退出主线程 } System.out.println("end job"); }
打印结果以下:多线程
Start job
thread start
thread end
end job
Start job
thread start
thread end
end job
Start job
thread start
thread end
end job
使用isTerminated()方法等多线程结束后在结束job;多线程任务派发结束后,要使用shutdown()方法顺序关闭线程(等待正在执行任务,不接受新任务)并发
定义一个job:ranJob,设置每秒执行一次,设置不容许覆盖并发执行ide
job代码:spa
程序输出结果:线程
从结果能够看到,job的并发覆盖配置彷佛根本没有生效,缘由是:job没有关注多线程执行状况code
修改job代码,添加以下代码在job访问最后,线程处理完job才结束,xml
修改代码后程序结果:blog
能够看到job始终没有结束,说明ExecutorService始终没有终止,看看文档,加入shutdonw()方法,job全部代码以下:
打印结果以下:
OK,至此spring quartz多线程并发问题解决。回顾下,咱们要使用isTerminated()方法等多线程结束后在结束job;多线程任务派发结束后,要使用shutdown()方法顺序关闭线程(等待正在执行任务,不接受新任务)