<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java技術研究

    統計

    留言簿(3)

    閱讀排行榜

    評論排行榜

    spring quartz使用多線程并發“陷阱”(轉)

    定義一個job:ranJob,設置每秒執行一次,設置不允許覆蓋并發執行

     

    Xml代碼  
    1. <bean id="rankJob" class="com.chinacache.www.logstat.job.RankJob" />  
    2. <bean id="rankJobDetail"  
    3.     class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
    4.     <property name="targetObject" ref="rankJob" />  
    5.     <property name="targetMethod" value="execute" />  
    6.     <property name="concurrent" value="<span style="color: #ff0000;"><strong>false</strong></span>/>  
    7. </bean>  
    8. <bean id="rankJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
    9.     <property name="jobDetail" ref="rankJobDetail" />  
    10.     <!-- 單位 ms,半小時 1800000 ms -->  
    11.     <property name="repeatInterval" value="<span style="color: #ff0000;"><strong>1000</strong></span>/>  
    12. </bean>  

     

    job代碼:

    Java代碼  
    1. System.out.println("Start job");  
    2. ExecutorService exec = Executors.newFixedThreadPool(1);  
    3.   
    4. Thread thread = new Thread(new Runnable() {  
    5.     @Override  
    6.     public void run() {  
    7.         System.out.println("thread start");  
    8.         try {  
    9.             Thread.sleep(3000);  
    10.         } catch (InterruptedException e) {  
    11.             // TODO Auto-generated catch block  
    12.             e.printStackTrace();  
    13.         }  
    14.         System.out.println("thread end");  
    15.     }  
    16. });  
    17. exec.execute(thread);  
    18. System.out.println("end job");  

     

    程序輸出結果:

    Java代碼  
    1. Start job  
    2. end job  
    3. <span style="color: #ff0000;"><strong>thread start</strong></span>  
    4. Start job  
    5. end job  
    6. thread start  
    7. Start job  
    8. end job  
    9. thread start  
    10. Start job  
    11. end job  
    12. thread start  
    13. <strong><span style="color: #ff0000;">thread end</span></strong>  

     

    從結果可以看到,job的并發覆蓋配置似乎根本沒有生效,原因是:job沒有關注多線程執行情況

    修改job代碼,添加如下代碼在job訪問最后,線程處理完job才結束,

     

    Java代碼  
    1. while (!exec.isTerminated()) {  
    2.     // 等待所有子線程結束,才退出主線程  
    3. }  

     

    修改代碼后程序結果:

    Java代碼  
    1. Start job  
    2. thread start  
    3. thread end  

     

    可以看到job始終沒有結束,說明ExecutorService始終沒有終止,看看文檔,加入shutdonw()方法,job所有代碼如下:

    Java代碼  
    1. public void execute() throws InterruptedException {  
    2.     System.out.println("Start job");  
    3.     ExecutorService exec = Executors.newFixedThreadPool(1);  
    4.       
    5.     Thread thread = new Thread(new Runnable() {  
    6.         @Override  
    7.         public void run() {  
    8.             System.out.println("thread start");  
    9.             try {  
    10.                 Thread.sleep(3000);  
    11.             } catch (InterruptedException e) {  
    12.                 // TODO Auto-generated catch block  
    13.                 e.printStackTrace();  
    14.             }  
    15.             System.out.println("thread end");  
    16.         }  
    17.     });  
    18.     exec.execute(thread);  
    19.     exec.shutdown();  
    20.        while (!exec.isTerminated()) {  
    21.            // 等待所有子線程結束,才退出主線程  
    22.        }          
    23.     System.out.println("end job");  
    24. }  

     

    打印結果如下:

     

    Java代碼  
    1. Start job  
    2. thread start  
    3. thread end  
    4. end job  
    5.   
    6. Start job  
    7. thread start  
    8. thread end  
    9. end job  
    10.   
    11. Start job  
    12. thread start  
    13. thread end  
    14. end job  

     

     

    OK,至此spring quartz多線程并發問題解決。回顧下,我們要使用isTerminated()方法等多線程結束后在結束job;多線程任務派發結束后,要使用shutdown()方法順序關閉線程(等待正在執行任務,不接受新任務)

    posted on 2012-04-19 14:15 小秦 閱讀(8123) 評論(1)  編輯  收藏

    評論

    # re: spring quartz使用多線程并發“陷阱”(轉) 2013-09-24 11:24 sharkbobo

    ExecutorService exec = Executors.newFixedThreadPool(1);

    這個地方不能每次都new一個線程池,應該當作成員變量用。  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 亚洲Av高清一区二区三区| 美女视频黄视大全视频免费的| 国产麻豆视频免费观看| 亚洲JLZZJLZZ少妇| 人人狠狠综合久久亚洲婷婷| 精品国产无限资源免费观看| 特黄特色大片免费| 亚洲伊人tv综合网色| 免费h黄肉动漫在线观看 | 99精品视频在线免费观看| 97精品免费视频| 亚洲精品乱码久久久久久蜜桃图片| 国产精品V亚洲精品V日韩精品| 222www在线观看免费| 色婷婷综合缴情综免费观看| 精品日韩亚洲AV无码| 亚洲国产精品成人一区| 1a级毛片免费观看| gogo免费在线观看| 456亚洲人成在线播放网站| 在线亚洲97se亚洲综合在线| 日本免费一二区在线电影| 97av免费视频| 国产区在线免费观看| 日韩亚洲人成网站| 亚洲狠狠狠一区二区三区| 久久精品国产亚洲AV不卡| 一二三四免费观看在线视频中文版 | 国产V亚洲V天堂A无码| 精品国产免费观看久久久| 外国成人网在线观看免费视频| 日本一区二区三区在线视频观看免费 | 国产精品色拉拉免费看| a级日本高清免费看| 国产91成人精品亚洲精品| 国产99在线|亚洲| 99亚洲精品高清一二区| 亚洲日韩中文字幕在线播放| 啊v在线免费观看| 免费毛片在线视频| 色窝窝免费一区二区三区|