คำนำ
ฉันได้เขียนบทความหลายเรื่องเกี่ยวกับการใช้งานการโทรแบบอะซิงโครนัสโดยใช้ @async และฉันยังได้รับคำติชมจากรองเท้าเด็กหลายคน ในหมู่พวกเขาปัญหาส่วนใหญ่เกี่ยวกับการใช้ฟิวเจอร์สและการควบคุมการหมดเวลาของการดำเนินการแบบอะซิงโครนัส ดังนั้นฉันจะพูดถึงการจัดการปัญหาทั้งสองนี้ด้วยกัน
หากคุณไม่ทราบการใช้คำอธิบายประกอบ @async คุณสามารถตรวจสอบบทความก่อนหน้าดังนี้:
กำหนดงานอะซิงโครนัส
ก่อนอื่นเราใช้คำอธิบายประกอบ @async เพื่อกำหนดงานอะซิงโครนัส วิธีนี้ส่งคืนประเภทในอนาคตดังนี้:
@slf4j@componentpublic class task {สุ่มแบบคงที่สาธารณะแบบสุ่ม = ใหม่สุ่ม (); @async ("taskexecutor") อนาคตสาธารณะ <String> run () โยนข้อยกเว้น {Long sleep = random.nextint (10,000); log.info ("เริ่มงานเวลาที่จะใช้:" + sleep + "msils"); Thread.sleep (นอนหลับ); log.info ("ทำงานให้เสร็จ"); ส่งคืน asyncresult ใหม่ <> ("ทดสอบ"); -เคล็ดลับ: ประเภทอนาคตคืออะไร?
Future เป็นอินเทอร์เฟซที่ยกเลิกผลการดำเนินการของงานที่เรียกใช้หรือเรียกได้เฉพาะตรวจสอบว่าแบบสอบถามเสร็จสมบูรณ์และได้รับผลลัพธ์ หากจำเป็นคุณสามารถรับผลการดำเนินการผ่านวิธี GET ซึ่งบล็อกจนกว่างานจะส่งคืนผลลัพธ์
คำจำกัดความของอินเทอร์เฟซมีดังนี้:
อินเทอร์เฟซสาธารณะในอนาคต <v> {บูลีนยกเลิก (บูลีน Mayinterruptifrunning); บูลีน iscancelled (); บูลีน iSdone (); v get () พ่น InterruptedException, ExecutionException; V Get (Long Timeout, TimeUnit Unit) พ่น InterruptedException, ExecutionException, TimeOutException;}มันประกาศห้าวิธีเช่นนี้:
กล่าวอีกนัยหนึ่งอนาคตมีสามฟังก์ชั่น:
ทดสอบการดำเนินการและการหมดเวลานิยาม
หลังจากเสร็จสิ้นคำจำกัดความงานแบบอะซิงโครนัสที่ส่งคืนอนาคตเราพยายามใช้การทดสอบหน่วยเพื่อใช้อนาคตนี้เพื่อดำเนินการตามงานเช่น::
@slf4j@runwith (springjunit4classrunner.class) @springboottestpublic คลาสแอปพลิเคชัน {@autowired งานส่วนตัว; @Test Public Void Test () พ่นข้อยกเว้น {อนาคต <String> futureresult = task.run (); สตริงผลลัพธ์ = futureresult.get (5, timeUnit.seconds); log.info (ผลลัพธ์); -ในรหัสข้างต้นเรายังกำหนดเวลาหมดเวลาสำหรับเธรดเพื่อดำเนินการในวิธีการรับ โดยการดำเนินการทดสอบนี้เราสามารถสังเกตได้ว่าเมื่อเวลาดำเนินการเกิน 5 วินาทีข้อยกเว้นการหมดเวลาจะถูกโยนลงที่นี่ เธรดการดำเนินการสามารถปล่อยกลับไปที่พูลเธรดเนื่องจากหมดเวลาดำเนินการเพื่อไม่ให้บล็อกและครอบครองทรัพยากร
ตัวอย่างที่สมบูรณ์:
ผู้อ่านสามารถเลือกที่เก็บสองแห่งต่อไปนี้เพื่อดูบทที่ 4-1-4 โครงการตามการตั้งค่าของพวกเขา:
GitHub: https://github.com/dyc87112/springboot-learning/
Gitee: https://gitee.com/diidispace/springboot-learning/
ดาวน์โหลดท้องถิ่น: http://xiazai.vevb.com/201805/yuanma/springboot-learning(vevb.com).rar
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com