一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線程、定時器同步首頁數(shù)據(jù)

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

2020-05-11 11:24eson_15 JAVA教程

這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線程、定時器同步首頁數(shù)據(jù),感興趣的小伙伴們可以參考一下

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

?
1
2
Timer(boolean isDaemon)
//創(chuàng)建一個新計(jì)時器,可以指定其相關(guān)的線程作為守護(hù)程序運(yùn)行。

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

?
1
2
3
4
5
void schedule(TimerTask task, Date firstTime, long period) 
//安排指定的任務(wù)在指定的時間開始進(jìn)行重復(fù)的固定延遲執(zhí)行。
//第一個參數(shù)是指定任務(wù),即TimerTask對象;第二個參數(shù)為第一次開啟任務(wù)時間;
 
第三個參數(shù)為時間間隔,即每隔多長時間執(zhí)行一次

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Component //把該對象交給Spring管理
public class ProductTimerTask extends TimerTask {
   
  @Resource
  private ProductService productService = null; //注入productService
  @Resource
  private CategoryService categoryService = null; //注入categoryService
   
  private ServletContext application = null; //定義一個ServletContext對象,因?yàn)槲覀兏铝撕笈_數(shù)據(jù)后,需要存入application域里面
   
  public void setApplication(ServletContext application) {
    this.application = application; //通過監(jiān)聽器將這個application對象set進(jìn)來,因?yàn)檫@里是無法拿application對象的
  }
   
  @Override
   //和監(jiān)聽器在項(xiàng)目啟動的時候數(shù)據(jù)初始化的邏輯一樣
  public void run() {
    System.out.println("----run----");
    List<List<Product>> bigList = new ArrayList<List<Product>>(); //bigList中存放一個裝有Category類的list
     // 1. 查詢出熱點(diǎn)類別
    for(Category category : categoryService.queryByHot(true)) {
      //根據(jù)熱點(diǎn)類別id獲取推薦商品信息
      List<Product> lst = productService.querByCategoryId(category.getId());
      bigList.add(lst); //將裝有category的list放到bigList中
    }
     // 2. 把查詢的bigList交給application內(nèi)置對象
     application.setAttribute("bigList", bigList); //假設(shè)我們已經(jīng)拿到了application對象
  }
 
}

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//@Component //監(jiān)聽器是web層的組件,它是tomcat實(shí)例化的,不是Spring實(shí)例化的。不能放到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,因?yàn)閜roductTimerTask里面是拿不到application的,只能通過監(jiān)聽器set給它
    productTimerTask.setApplication(event.getServletContext());
 
    //通過設(shè)置定時器,讓首頁的數(shù)據(jù)每個一小時同步一次(配置為守護(hù)線程)
    new Timer(true).schedule(productTimerTask, 0, 1000*60*60);//每個一小時執(zhí)行一次productTimerTask任務(wù),即更新一下后臺數(shù)據(jù)
  }
 
}

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 草莓香蕉绿巨人丝瓜榴莲18 | 亚洲精品成人 | 日韩成片| 日本在线你懂的 | 成人免费视频一区二区三区 | 色哟哟哟在线精品观看视频 | 精品视频免费在线 | 奇米777四色精品综合影院 | 麻豆最新地址 | 欧美夜夜精品一级爽 | 啊好爽视频 | 99久久精品免费看国产情侣 | 欧美日韩亚洲一区二区三区在线观看 | 免费在线观看成年人视频 | 国产色在线观看 | 啊啊啊好大视频 | 欧美日韩国产精品va | 日韩欧美高清视频 | 好大用力深一点视频 | japonensis中国东北老人 | 欧美草逼网站 | 亚州日韩精品AV片无码中文 | 国产日韩欧美一区 | 国产伦久视频免费观看视频 | 日本www色视频成人免费 | 韩国三级年轻的小婊孑 | 韩国黄色网址 | 日韩欧美中文字幕出 | 三级网站午夜三级 | 国内外精品免费视频 | 色播开心网 | a级片欧美| 欧美精品超清在线播放 | 地址二地址三2021变更 | 亚洲视频中文字幕 | 国产精品污双胞胎在线观看 | 奇米影视奇米色777欧美 | 美女脱了内裤打开腿让男人图片 | 日韩视频在线免费观看 | youjizzxxx69日本 | 狠狠综合久久综合网站 |