พูลเธรดสามารถดำเนินการหลายงานพร้อมกัน บางครั้งเราอาจต้องการติดตามผลการดำเนินงานของงาน แม้ภายในระยะเวลาหนึ่งหากงานยังไม่เสร็จเราอาจต้องการยกเลิกการดำเนินงาน เพื่อรองรับคุณสมบัตินี้ ThreadPoolexecutor ให้ FutureTask สำหรับการติดตามการดำเนินการและการยกเลิกงาน บทความนี้แนะนำหลักการดำเนินการของ FutureTask
เพื่อให้เข้าใจถึงหลักการการใช้งานของ FutureTask ได้ดีขึ้นก่อนอื่นเราให้บริการอินเทอร์เฟซที่สำคัญและโครงสร้างคลาสหลายประการดังที่แสดงในรูปด้านล่าง:
ThreadPoolexecutor จัดเตรียมอินเทอร์เฟซส่งสำหรับการส่งงาน ส่งสนับสนุนสองอินเทอร์เฟซที่แตกต่างกัน: Runnable และ Callable เพื่อให้อินเทอร์เฟซภายนอกแบบครบวงจร JDK จะรวมเข้ากับการเรียกใช้งานได้ซึ่งทั้งหมดนี้ถูกนำไปใช้ผ่านอะแดปเตอร์ RunnableAdapter ต่อไปนี้เป็นซอร์สโค้ดของ runnableadapter:
คลาสสุดท้ายของคลาสคงที่ runnableadapter <t> ใช้งาน callable <t> {งานสุดท้ายที่เรียกใช้งานได้; ผลลัพธ์สุดท้าย; RunnableAdapter (งานที่เรียกใช้ได้ผลลัพธ์ t) {this.task = task; this.result = ผลลัพธ์; } การโทรสาธารณะ t () {task.run (); ผลการกลับมา; -Runnableadapter เป็นคลาสการใช้งานของ callable ซึ่งใช้วิธีการโทร วิธีการโทรเพียงแค่เรียกใช้ task.run () จากนั้นส่งคืนผลลัพธ์ซึ่งทำให้มั่นใจได้ว่าจะต้องจัดการอินเตอร์เฟสที่เรียกได้เฉพาะภายในอย่างสม่ำเสมอ
ผ่านส่วนก่อนหน้านี้เรารู้ว่างานที่ส่งมาได้จะถูกแปลงภายในเป็นงานที่เรียกได้ภายใน ตรวจสอบค่าส่งคืนของวิธีการส่งซึ่งเป็นอนาคต ในความเป็นจริงอนาคตนี้เป็นอินสแตนซ์ FutureTask ผ่านอินสแตนซ์นี้การเรียกเมธอด GET สามารถบล็อกเธรดปัจจุบันได้จนกว่างานจะเสร็จสมบูรณ์และผลลัพธ์จะถูกส่งคืน
ห่วงโซ่การโทรทั้งหมดมีลักษณะเช่นนี้:
เธรดคนงาน -> futureTask.run () -> callable.call () -> task.run ()
หากมีการส่งงานที่เรียกได้ว่ามีการโทรสามครั้งแรกเท่านั้น
เพื่อแสดงให้เห็นถึงกระบวนการทั้งหมดที่ดีขึ้นตัวอย่างต่อไปนี้จะถูกนำมาใช้เพื่อแสดงกระบวนการดำเนินการ
1. ส่งงาน callable ไปยังพูลเธรด (Runnable จะถูกแปลงเป็น callable) ในเวลานี้ callable จะถูกส่งไปยังอินสแตนซ์ futureTask ดังที่แสดงด้านล่าง:
2. พูลเธรดใช้เธรดเพื่อดำเนินการงาน FutureTask
กระบวนการดำเนินงานนั้นค่อนข้างง่าย ในท้ายที่สุดวิธีการ callable.call () หรือ runnable.run () จะถูกเรียกและผลลัพธ์จะได้รับซึ่งจะเก็บผลลัพธ์ในคุณสมบัติผลลัพธ์ของอินสแตนซ์ futureTask และสถานะจะถูกแก้ไขเป็นปกติแสดงว่างานได้ถูกดำเนินการและผลลัพธ์จะได้รับ
เราสมมติว่าหลายเธรดเรียกวิธีการรับของอินสแตนซ์ FutureTask เดียวกันในระหว่างการดำเนินการของ callable.call() ในเวลานี้เธรดเหล่านี้จะถูกบล็อกและเก็บไว้ในสแต็กดังแสดงในรูปด้านล่าง:
เธรด 1, 2 และ 3 โทรหาวิธี FutureTask.get เนื่องจากงานยังไม่ถูกดำเนินการทั้งสามเธรดจะถูกบล็อกและง่วงนอน มีสแต็คใน FutureTask เพื่อเก็บเธรดที่รออยู่ ตัวชี้ด้านบนของสแต็กอ้างอิงโดย FutureTask.waiters เมื่องานถูกดำเนินการเธรดในสแต็กทั้งหมดจะวนซ้ำ ในเวลานี้แต่ละเธรดจะถูกปลุกและผลการปฏิบัติงานสามารถได้รับสำเร็จ (ผลการดำเนินการจะถูกเก็บไว้ใน FutureTask.outcome)
FutureTask ยังรองรับฟังก์ชั่นการยกเลิกของงานซึ่งทั้งหมดนี้ประสานงานหลายเธรดผ่านสถานะของ FutureTask
อินเทอร์เฟซ FutureTask เป็นกลไกการใช้งานที่ให้การติดตามและควบคุมการดำเนินงาน เมื่อเทียบกับพูลเธรดเองมันค่อนข้างง่ายและฉันเชื่อว่ามันไม่ยากที่จะเข้าใจ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับหลักการดำเนินการของ FutureTask ในพูลเธรด Java ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!