多線使用點滴

  java面試中經常被問到是否使用多線程,一時楞在那邊,腦袋中沒有內容,今天剛好做了一個多線程功能,特此記錄一下。

1.項目背景:做一個在線活動,設置活動開始時間,結束時間;活動開始時,發郵件通知活動參與者,更新活動狀態,活動結束時,發郵件通知參與者活動結果,更新活動狀態。

思路:最初第一個想法是,利用spring定時任務Quartz進行實時掃描,比如5秒鐘掃一次,時間到了就開始執行。缺點:性能嚴重浪費,任務執行時間不準確,會偏差0-5秒,直接否了。後來採用線程池新建線程,延遲執行。ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5),使用schedule創建線程延遲delay,活動創建時直接創建線程,功能可以實現。那麼,問題又出現了,在線程創建後還在等待中未執行,服務器重啓了,那麼該線程就會丟失,因此需要一張表記錄線程執行情況,spring將所有bean加載完成後去掃描線程表實現InitializingBean接口,如果還存在線程未執行,重新創建線程任務。

問題:bean實現InitializingBean接口,啓動後完成後一直沒有調用afterPropertiesSet方法,後來發現web.xml中dispatcherServlet的load-on-startup沒有設置,默認是延遲加載,訪問是才加載bean,後來設置<load-on-startup>1</load-on-startup>,問題解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章