“สวัสดี อามีโก้!”
"ไม่มีอะไรสมบูรณ์แบบเมื่อสร้างขึ้นครั้งแรก เช่นเดียวกับเธรด ในเวลาต่อมา ผู้สร้าง Java เริ่มเชื่อมั่นในข้อบกพร่องของอินเทอร์เฟซ Runnable ไม่สนับสนุนการโยนข้อยกเว้นและไม่ได้ทำให้สามารถค้นหา ผลการปฏิบัติงาน…”
"อินเทอร์เฟซที่เรียกใช้ได้เหมาะสำหรับงานอิสระขนาดใหญ่มากกว่างานย่อยขนาดเล็กที่คุณต้องการเรียกใช้ครั้งละโหล จากนั้นจึงรวบรวมผลลัพธ์"
"นั่นคือเหตุผลที่ อินเทอร์เฟซ Callableถูกคิดค้นขึ้น มันเหมาะสำหรับการดำเนินการแบบขนานของงานขนาดเล็กมากกว่าRunnableและThreadส่วนหนึ่งเป็นเพราะอินเทอร์เฟซทั่วไป"
"นี่คือการใช้งานทั่วไปของอินเทอร์เฟซ:"
class ReverseString implements Callable<String>
{
String str;
ReverseString(String str)
{
this.str = str;
}
public String call() throws Exception
{
StringBuilder builder = new StringBuilder(str);
builder.reverse();
return builder.toString();
}
}
"ไม่เหมือนกับRunnableที่นี่เราต้องแทนที่เมธอดการโทร ซึ่งส่งคืนผลลัพธ์ของประเภทที่ระบุโดยอาร์กิวเมนต์ประเภท วิธีนี้สะดวกกว่าเมธอดเรียกใช้ของอินเทอร์เฟซ Runnable ซึ่งส่งคืนค่าโมฆะ บางครั้งนักพัฒนาต้องคิดขึ้นมาเอง วิธีแก้ไขต่างๆ เพื่อให้ได้ผลลัพธ์ของเธรด"
"ฉันเห็น."
"และตอนนี้ดูว่าCallableสามารถทำงานร่วมกับ ThreadPoolExecutor ได้อย่างไร:
"อย่างแรก วิธีการส่งของคลาส ThreadPoolExecutorจะส่งคืนออบเจกต์ Future ที่กำหนดพารามิเตอร์ คุณสามารถใช้ออบเจ็กต์นี้เพื่อดูว่างานเสร็จสิ้นหรือไม่และรับผลลัพธ์"
"นี่คือวิธีการทำงาน:"
// 1. Create a ThreadPoolExecutor
ExecutorService service = Executors.newFixedThreadPool(5);
// 2. Add a task to it
Future<String> task = service.submit(new ReverseString("Amigo"));
// 3. Wait until the task is done
while(!task.isDone())
{
Thread.sleep(1);
}
// 4. Try to get the result
//We will get either the result, or an exception if one occurred while the task was being executed
try
{
System.out.println("Full string : " + task.get());
}
catch (Exception ie)
{
ie.printStackTrace(System.err);
}
// 5. Stop the ThreadPool.
service.shutdown();
"ไกลออกไป! ฉันชอบคลาส Future เป็นพิเศษ มันมีวิธีการอย่างไร?"
"นี่คือสิ่งที่น่าสนใจที่สุด:"
วิธี | คำอธิบาย |
---|---|
|
หยุดงาน |
|
คืนค่าจริงหากงานหยุด |
|
คืนค่าจริงหากงานกำลังดำเนินการอยู่ |
|
ส่งกลับผลลัพธ์ของวิธีการโทรหรือส่งข้อยกเว้นหากเกิดขึ้น |
"เยี่ยมมาก! คุณยังสามารถหยุดงานได้อีกด้วย"
"อย่าพึ่งพาสิ่งนี้มากเกินไป ไม่ใช่ว่าทุกเธรดจะหยุดได้ แต่ถ้างานยังคงอยู่ในคิว การดำเนินการนี้จะทำงานได้ดี"
"ฉันชอบวิธีนี้ สะดวกกว่าการสร้างเธรดด้วยตัวเองแล้วพยายามดึงผลลัพธ์ออกมา"
"เยี่ยมมาก นั่นคือจุดที่เราจะสิ้นสุดในวันนี้"
GO TO FULL VERSION