最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SSH框架網(wǎng)上商城項目第15戰(zhàn)之線程、定時器同步首頁數(shù)據(jù)

 更新時間:2016年06月03日 14:45:52   作者:eson_15  
這篇文章主要為大家詳細介紹了SSH框架網(wǎng)上商城項目第15戰(zhàn)之線程、定時器同步首頁數(shù)據(jù),感興趣的小伙伴們可以參考一下

上一節(jié)我們做完了首頁UI界面,但是有個問題:如果我在后臺添加了一個商品,那么我必須重啟一下服務器才能重新同步后臺數(shù)據(jù),然后刷新首頁才能同步數(shù)據(jù)。這明顯不是我們想要的效果,一般這種網(wǎng)上商城首頁肯定不是人為手動同步數(shù)據(jù)的,那么如何解決呢?我們需要用到線程和定時器來定時自動同步首頁數(shù)據(jù)。
1. Timer和TimerTask
我們需要用到Timer和TimerTask兩個類。先來介紹下這兩個類。
Timer是一種工具類,在java.util包中,線程用其安排以后在后臺線程中執(zhí)行的任務??砂才湃蝿請?zhí)行一次,或者定期重復執(zhí)行。它有個構造函數(shù):

Timer(boolean isDaemon) 
//創(chuàng)建一個新計時器,可以指定其相關的線程作為守護程序運行。 

守護線程即主線程結束后,該線程也結束,非守護線程即主線程結束后,該線程仍然繼續(xù)執(zhí)行。isDaemon為true時為守護線程。Timer類有個schedule方法可以創(chuàng)建一個任務,如下:

void schedule(TimerTask task, Date firstTime, long period)  
//安排指定的任務在指定的時間開始進行重復的固定延遲執(zhí)行。 
//第一個參數(shù)是指定任務,即TimerTask對象;第二個參數(shù)為第一次開啟任務時間;

第三個參數(shù)為時間間隔,即每隔多長時間執(zhí)行一次 

我們再來看看TimerTask,TimerTask是用來創(chuàng)建一個新的線程任務的,它實現(xiàn)了Runnable接口,如果我們要創(chuàng)建一個新的線程任務,只需要繼承TimerTask,并重寫run方法即可。

2. 創(chuàng)建一個新的線程任務
下面我們來創(chuàng)建一個新的線程任務,用來更新后臺數(shù)據(jù):

@Component //把該對象交給Spring管理 
public class ProductTimerTask extends TimerTask { 
   
  @Resource 
  private ProductService productService = null; //注入productService 
  @Resource 
  private CategoryService categoryService = null; //注入categoryService 
   
  private ServletContext application = null; //定義一個ServletContext對象,因為我們更新了后臺數(shù)據(jù)后,需要存入application域里面 
   
  public void setApplication(ServletContext application) { 
    this.application = application; //通過監(jiān)聽器將這個application對象set進來,因為這里是無法拿application對象的 
  } 
   
  @Override 
   //和監(jiān)聽器在項目啟動的時候數(shù)據(jù)初始化的邏輯一樣 
  public void run() { 
    System.out.println("----run----"); 
    List<List<Product>> bigList = new ArrayList<List<Product>>(); //bigList中存放一個裝有Category類的list 
     // 1. 查詢出熱點類別 
    for(Category category : categoryService.queryByHot(true)) { 
      //根據(jù)熱點類別id獲取推薦商品信息 
      List<Product> lst = productService.querByCategoryId(category.getId()); 
      bigList.add(lst); //將裝有category的list放到bigList中 
    } 
     // 2. 把查詢的bigList交給application內(nèi)置對象 
     application.setAttribute("bigList", bigList); //假設我們已經(jīng)拿到了application對象 
  } 
 
} 

接下來,我們修改項目啟動時監(jiān)聽器里面的內(nèi)容,原本上面的這個查詢操作是放在監(jiān)聽器中,當項目啟動時,監(jiān)聽器開始執(zhí)行,獲取后臺數(shù)據(jù),存到application域中,然后前臺通過jstl標簽從application域中拿到數(shù)據(jù)?,F(xiàn)在我們把這些事情交給我們定義的ProductTimerTask去做,那么監(jiān)聽器中只要設置一下定時器,讓ProductTimerTask定時去更新一下后臺數(shù)據(jù)即可??纯幢O(jiān)聽器中修改后的代碼:

3. 在監(jiān)聽器中啟動定時器

//@Component //監(jiān)聽器是web層的組件,它是tomcat實例化的,不是Spring實例化的。不能放到Spring中 
public class InitDataListener implements ServletContextListener { 
   
  private ProductTimerTask productTimerTask = null; //定義一個ProductTimerTask對象 
  private ApplicationContext context = null; 
   
  @Override 
  public void contextDestroyed(ServletContextEvent event) { 
    // TODO Auto-generated method stub 
 
  } 
 
  @Override 
  public void contextInitialized(ServletContextEvent event) { 
 
    context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());         
    productTimerTask = (ProductTimerTask) context.getBean("productTimerTask");//從配置文件中獲取ProductTimerTask對象 
 
    //把內(nèi)置對象交給productTimerTask,因為productTimerTask里面是拿不到application的,只能通過監(jiān)聽器set給它 
    productTimerTask.setApplication(event.getServletContext()); 
 
    //通過設置定時器,讓首頁的數(shù)據(jù)每個一小時同步一次(配置為守護線程) 
    new Timer(true).schedule(productTimerTask, 0, 1000*60*60);//每個一小時執(zhí)行一次productTimerTask任務,即更新一下后臺數(shù)據(jù) 
  } 
 
} 

 關于InitDataListener監(jiān)聽器中原來的操作代碼,可以對比上一節(jié)中的內(nèi)容,其實就是ProductTimerTask中的更新后臺數(shù)據(jù),只不過現(xiàn)在放到TimerTask中去做了而已。這樣我們就完成了使用線程和定時器定期同步首頁數(shù)據(jù),這個時間間隔可以自己設定。
其實CSDN博客里的部分首頁數(shù)據(jù)也不是實時更新的,每天晚上會有個時間更新一次,例如左側(cè)欄目中的博客排名,閱讀排行后的顯示的閱讀量等,這些都是每天晚上更新一次,應該就是在后臺設置了每天更新一次,原理跟這里應該是一樣的。這樣也減輕了服務器的壓力。

本文鏈接:http://blog.csdn.net/eson_15/article/details/51387378

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • myeclipse10配置tomcat教程詳解

    myeclipse10配置tomcat教程詳解

    這篇文章主要為大家詳細介紹了myeclipse10配置tomcat的教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 基于String不可變字符與StringBuilder可變字符的效率問題

    基于String不可變字符與StringBuilder可變字符的效率問題

    這篇文章主要介紹了String不可變字符與StringBuilder可變字符的效率問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Boot 2.0快速構建服務組件全步驟

    Spring Boot 2.0快速構建服務組件全步驟

    這篇文章主要給大家介紹了關于Spring Boot 2.0快速構建服務組件的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot 2.0具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • java中List集合及其實現(xiàn)類的方法詳解

    java中List集合及其實現(xiàn)類的方法詳解

    本篇文章給大家?guī)淼膬?nèi)容是關于java中List集合及其實現(xiàn)類的方法介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。下面我們就來學習一下吧
    2019-06-06
  • java實現(xiàn)計算地理坐標之間的距離

    java實現(xiàn)計算地理坐標之間的距離

    java實現(xiàn)計算地理坐標之間的距離,主要是通過計算兩經(jīng)緯度點之間的距離來實現(xiàn),有需要的小伙伴參考下吧
    2015-03-03
  • SpringBoot接收前端參數(shù)的幾種方式分享

    SpringBoot接收前端參數(shù)的幾種方式分享

    這篇文章給大家分享幾種SpringBoot接收前端參數(shù)的方式,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-09-09
  • SpringBoot讀取yml文件中配置數(shù)組的2種方法

    SpringBoot讀取yml文件中配置數(shù)組的2種方法

    這篇文章主要介紹了SpringBoot讀取yml文件中配置數(shù)組的2種方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中Bigdecimal類的toString()方法和toPlainString()方法區(qū)別

    Java中Bigdecimal類的toString()方法和toPlainString()方法區(qū)別

    BigDecimal類有多個方法可以將其轉(zhuǎn)換為字符串,其中包括toString()和toPlainString(),本文主要介紹了Java中Bigdecimal類的toString()方法和toPlainString()方法區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • 淺談Java的WeakHashMap源碼

    淺談Java的WeakHashMap源碼

    這篇文章主要介紹了淺談Java的WeakHashMap源碼,WeakHashMap,從名字可以看出它是某種?Map,它的特殊之處在于?WeakHashMap?里的entry可能會被GC自動刪除,即使程序員沒有調(diào)用remove()或者clear()方法,需要的朋友可以參考下
    2023-09-09
  • Java打亂ArrayList生成一個隨機序列列表

    Java打亂ArrayList生成一個隨機序列列表

    有時候會需要將一個ArrayList或者數(shù)組中的數(shù)字打亂,方便后續(xù)使用,比如隨機出題、答案選項打亂、連線題打亂、抽獎號碼打亂等等,把我自己寫的一段代碼貼出來分享給大家。
    2016-08-08

最新評論

阳山县| 阿克陶县| 阜南县| 丹巴县| 诏安县| 宣武区| 蒙阴县| 安达市| 永川市| 堆龙德庆县| 手游| 侯马市| 定远县| 乌兰浩特市| 加查县| 巴塘县| 巴东县| 泰安市| 通江县| 汝南县| 黄石市| 博乐市| 荥经县| 奉新县| 抚顺县| 呼伦贝尔市| 太保市| 会理县| 宝坻区| 六盘水市| 平江县| 芜湖市| 伊宁县| 资源县| 上虞市| 南皮县| 芒康县| 开封县| 临夏县| 乐清市| 策勒县|