1. แนวคิด
อนาคตแสดงถึงผลลัพธ์ของงานอะซิงโครนัสที่อาจยังไม่เสร็จสมบูรณ์ สามารถเพิ่มการโทรกลับลงในผลลัพธ์นี้ เพื่อดำเนินการที่เกี่ยวข้องหลังจากการดำเนินการสำเร็จหรือล้มเหลว
2. อินเทอร์เฟซในอนาคต
อินเทอร์เฟซในอนาคตกำหนดวิธีอินเทอร์เฟซหลักห้าวิธี RunnableFuture และ ScheduleFuture สืบทอดอินเทอร์เฟซนี้ และ CompleteFuture และ ForkJoinTask สืบทอดอินเทอร์เฟซนี้
3. ตัวอย่าง
การทดสอบบรรจุภัณฑ์ นำเข้า java.util.concurrent.Callable; นำเข้า java.util.concurrent.ExecutionException; นำเข้า java.util.concurrent.FutureTask; คลาสสาธารณะ CallableFutureTest { โมฆะคงที่สาธารณะ main (String [] args) { startTime ยาว = System.currentTimeMillis(); Callable<Integer> CalculatorCallable = ใหม่ Callable<Integer>() { @แทนที่ การเรียกจำนวนเต็มสาธารณะ () พ่นข้อยกเว้น { // TODO ต้นขั้ววิธีการสร้างอัตโนมัติ Thread.sleep (2000); // การจำลองใช้เวลานาน int ผลลัพธ์ = 1+2; ส่งคืนผลลัพธ์; - - FutureTask<Integer> คำนวณFutureTask = FutureTask ใหม่<>(calculateCallable); เธรด t1 = เธรดใหม่ (calculateFutureTask); t1.เริ่มต้น(); //ตอนนี้เข้าร่วม Thread เพื่อเรียกใช้บริการที่ใช้เวลานานซึ่งจำลองการโทรระยะไกลและอาศัยผลการคำนวณ (เช่น เครื่องคำนวณเครือข่าย) พยายาม { //จำลองงานที่ใช้เวลานาน เธรดหลักทำหน้าที่ของตัวเอง สะท้อนถึงข้อดีของ Thread.sleep(3000) แบบมัลติเธรด อินท์เอ = 3+5; ผลลัพธ์จำนวนเต็ม = คำนวณFutureTask.get(); System.out.println("result = "+(a+result));//จำลองผลลัพธ์การทำงานของเธรดหลักโดยอาศัยเธรดย่อยแบบยาว endTime = System.currentTimeMillis(); System.out.println("time = "+(endTime-startTime)+"ms"); } จับ (InterruptedException | ExecutionException e) { // TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ e.printStackTrace(); - - -
ดังที่คุณเห็นจากข้างต้น เวลาข้างต้นคือประมาณ 3 วินาที ที่จริงแล้วคือเวลาที่ใช้โดยเธรดหลัก (3000) หากเราไม่ใช้ Future และอาศัยผลลัพธ์ของเธรด เวลาที่เราอาจต้องการอาจเป็น 5 วินาที (เธรดย่อย 2 วินาที + เธรดหลัก 3 วินาที)
ข้างต้นคือ วิธีที่ Future ได้รับผลลัพธ์ของเธรดใน Java อาจกล่าวได้ว่า Future มีความยืดหยุ่นมากกว่าในการประมวลผลเธรด กลไกโดยประมาณคือเมื่อเธรดหนึ่งทำงานอยู่ อีกเธรดหนึ่งจะทำงานในเวลาเดียวกัน หากสนใจสามารถเรียนรู้เพิ่มเติมหลังเลิกเรียนได้