定義一個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()方法順序關閉線程(等待正在執行任務,不接受新任務)