ในส่วนก่อนหน้าเราเสร็จสิ้นอินเตอร์เฟสโฮมเพจ UI แต่มีปัญหา: ถ้าฉันเพิ่มผลิตภัณฑ์ในพื้นหลังฉันต้องรีสตาร์ทเซิร์ฟเวอร์เพื่อซิงซิงข้อมูลพื้นหลังแล้วรีเฟรชโฮมเพจเพื่อซิงโครไนซ์ข้อมูล เห็นได้ชัดว่านี่ไม่ใช่เอฟเฟกต์ที่เราต้องการ โดยทั่วไปหน้าแรกของห้างสรรพสินค้าออนไลน์ประเภทนี้ไม่ใช่ข้อมูลที่ซิงโครไนซ์ด้วยตนเองแน่นอนดังนั้นจะแก้ปัญหาได้อย่างไร? เราจำเป็นต้องใช้เธรดและตัวจับเวลาเพื่อซิงโครไนซ์ข้อมูลหน้าแรกโดยอัตโนมัติ
1. ตัวจับเวลาและ timertask
เราจำเป็นต้องใช้คลาส Timer และ Timertask มาแนะนำสองหมวดหมู่นี้ก่อน
ตัวจับเวลาเป็นคลาสเครื่องมือ ในแพ็คเกจ java.util เธรดใช้เพื่อจัดเรียงงานที่จะดำเนินการในเธรดพื้นหลังในภายหลัง งานสามารถดำเนินการได้หนึ่งครั้งหรือสามารถดำเนินการอย่างสม่ำเสมอ มันมีตัวสร้าง:
ตัวจับเวลา (บูลีน Isdaemon) // สร้างตัวจับเวลาใหม่ที่สามารถระบุเธรดที่เกี่ยวข้องเพื่อทำงานเป็น daemon
หลังจากเธรด daemon นั่นคือเธรดหลักจะจบลงเธรดจะสิ้นสุดและหลังจากเธรดที่ไม่ใช่ Daemon นั่นคือเธรดหลักจะสิ้นสุดเธรดจะยังคงดำเนินการต่อไป เมื่อ Isdaemon เป็นจริงมันเป็นด้าย Daemon คลาสจับเวลามีวิธีการกำหนดเวลาที่สามารถสร้างงานดังต่อไปนี้:
โมฆะกำหนดการ (งาน TimerTask วันที่ครั้งแรกระยะเวลานาน) // กำหนดเวลางานที่ระบุเพื่อดำเนินการดำเนินการล่าช้าคงที่ซ้ำ ๆ ในเวลาที่กำหนด // พารามิเตอร์แรกคืองานที่ระบุนั่นคือวัตถุ TimerTask; พารามิเตอร์ที่สองเป็นเวลาเปิดงานแรก พารามิเตอร์ที่สามคือช่วงเวลานั่นคือใช้เวลานานแค่ไหนในการดำเนินการทุกครั้ง
มาดู Timertask กันเถอะ Timertask ใช้เพื่อสร้างงานเธรดใหม่ มันใช้อินเทอร์เฟซที่รันได้ หากเราต้องการสร้างงานเธรดใหม่เราจะต้องสืบทอด TimerTask และเขียนวิธีการเรียกใช้ใหม่
2. สร้างงานเธรดใหม่
มาสร้างงานเธรดใหม่เพื่ออัปเดตข้อมูลพื้นหลัง:
@component // ปล่อยให้วัตถุไปยังสปริงการจัดการระดับสาธารณะ ProductTimerTask ขยาย TimerTask {@Resource ผลิตภัณฑ์ส่วนตัว Productservice Productservice = NULL; // inject productservice @Resource หมวดหมู่ส่วนตัวหมวดหมู่ประเภทบริการ = null; // inject categoryservice private servletContext แอปพลิเคชัน = null; // กำหนดวัตถุ servletContext เนื่องจากหลังจากเราอัปเดตข้อมูลพื้นหลังเราจำเป็นต้องจัดเก็บไว้ในโมฆะการตั้งค่าโมฆะสาธารณะของแอปพลิเคชัน (แอปพลิเคชัน ServletContext) {this.application = แอปพลิเคชัน; // ตั้งค่าวัตถุแอปพลิเคชันนี้ผ่านผู้ฟังเนื่องจากวัตถุแอปพลิเคชันไม่สามารถนำมาได้ที่นี่} @Override // ตรรกะเดียวกับการเริ่มต้นข้อมูลของผู้ฟังเมื่อโครงการเริ่มต้นโมฆะสาธารณะ Run () {System.out.println ("--------"); รายการ <list <product>> biglist = new ArrayList <list <product> (); // การจัดเก็บรายการที่มีคลาสหมวดหมู่ใน BigList // 1 สอบถามหมวดหมู่ร้อนสำหรับ (หมวดหมู่หมวดหมู่: หมวดหมู่ Service.QueryByHot (จริง)) {// รับข้อมูลผลิตภัณฑ์ที่แนะนำตามรายการ ID หมวดหมู่ร้อน <ผลิตภัณฑ์> LST = ProductsERVICE.URBERYCATEDYID (หมวดหมู่ biglist.add (lst); // ใส่รายการด้วยหมวดหมู่ใน BigList} // 2 ออกจาก Query BigList ไปยังแอปพลิเคชันวัตถุในตัวแอปพลิเคชัน SetAttribute ("BigList", BigList); // สมมติว่าเรามีวัตถุแอปพลิเคชัน}}ต่อไปเราจะแก้ไขเนื้อหาของผู้ฟังเมื่อเริ่มโครงการ การดำเนินการค้นหาต้นฉบับด้านบนถูกวางไว้ในผู้ฟัง เมื่อโครงการเริ่มต้นขึ้นผู้ฟังจะเริ่มดำเนินการรับข้อมูลพื้นหลังและเก็บไว้ในโดเมนแอปพลิเคชัน จากนั้นเบื้องหน้าจะได้รับข้อมูลจากโดเมนแอปพลิเคชันผ่านแท็ก JSTL ตอนนี้เรามอบสิ่งเหล่านี้ให้กับ ProductTimertask ที่เรากำหนดไว้ดังนั้นเพียงแค่ตั้งเวลาในการฟังและปล่อยให้ ProductTimerTask อัปเดตข้อมูลพื้นหลังเป็นประจำ ตรวจสอบรหัสที่แก้ไขในผู้ฟัง:
3. เริ่มจับเวลาในผู้ฟัง
//@Component // Listener เป็นส่วนประกอบของ Web Layer มันเป็นอินสแตนซ์โดย Tomcat ไม่ใช่ฤดูใบไม้ผลิ ไม่สามารถใส่ในสปริงคลาสสาธารณะ initDatalistener ใช้ servletContextListener {ProductsTimerTask ProductTimerTask = null; // กำหนด ProductTimerTask Object Private ApplicationContext Context = NULL; @Override เป็นโมฆะสาธารณะบริบท (เหตุการณ์ servletContextEvent) {// วิธีการที่สร้างอัตโนมัติแบบอัตโนมัติ} @Override โมฆะสาธารณะบริบทบริบท (Event ServletContextEvent) {context = webApplicationContextUtEtUtEdWebapplicationContext (Event.getServletContext ProductTimerTask = (ProductTimerTask) Context.getBean ("ProductTimerTask"); // รับวัตถุ ProductTimerTask จากไฟล์การกำหนดค่า // พูดคุยวัตถุในตัวกับ ProductTimerTask เนื่องจาก ProductTimerTask ไม่สามารถรับแอปพลิเคชันได้ // ตั้งค่าตัวจับเวลาเพื่อซิงโครไนซ์ข้อมูลในหน้าแรกทุก ๆ ชั่วโมง (กำหนดค่าเป็นเธรด daemon) ตัวจับเวลาใหม่ (จริง). schedule (ProductTimertask, 0, 1000*60*60); // ดำเนินการงาน ProductTimertask ทุก ๆ ชั่วโมง เกี่ยวกับรหัสการทำงานดั้งเดิมในผู้เริ่ม initDatalistener คุณสามารถเปรียบเทียบเนื้อหาในส่วนก่อนหน้า ในความเป็นจริงมันเป็นข้อมูลพื้นหลังการอัปเดตใน ProductTimerTask แต่มันก็แค่ใส่ลงใน TimerTask ในตอนนี้ ด้วยวิธีนี้เราเสร็จสิ้นการใช้เธรดและตัวจับเวลาเพื่อซิงโครไนซ์ข้อมูลหน้าแรกเป็นประจำและช่วงเวลานี้สามารถกำหนดได้ด้วยตัวเอง
ในความเป็นจริงข้อมูลหน้าแรกบางส่วนในบล็อก CSDN จะไม่ได้รับการอัปเดตแบบเรียลไทม์ จะมีเวลาอัปเดตทุกคืนเช่นการจัดอันดับบล็อกในคอลัมน์ด้านซ้ายจำนวนการดูที่แสดงหลังจากอ่านการจัดอันดับ ฯลฯ สิ่งเหล่านี้จะได้รับการปรับปรุงทุกคืนและควรตั้งค่าไว้ในพื้นหลังเพื่ออัปเดตวันละครั้ง หลักการควรจะเหมือนกับที่นี่ นอกจากนี้ยังช่วยลดแรงกดดันบนเซิร์ฟเวอร์
ลิงก์ไปยังบทความนี้: http://blog.csdn.net/eson_15/article/details/51387378
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น