Executor, ExecutorService, Executor - 1

“สวัสดี อามีโก้!”

"ไม่มีอะไรสมบูรณ์แบบเมื่อสร้างขึ้นครั้งแรก เช่นเดียวกับเธรด ในเวลาต่อมา ผู้สร้าง 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 เป็นพิเศษ มันมีวิธีการอย่างไร?"

"นี่คือสิ่งที่น่าสนใจที่สุด:"

วิธี คำอธิบาย
boolean cancel(boolean mayInterrupt);
หยุดงาน
boolean isCancelled();
คืนค่าจริงหากงานหยุด
boolean isDone();
คืนค่าจริงหากงานกำลังดำเนินการอยู่
V get() throws InterruptedException, ExecutionException;
ส่งกลับผลลัพธ์ของวิธีการโทรหรือส่งข้อยกเว้นหากเกิดขึ้น

"เยี่ยมมาก! คุณยังสามารถหยุดงานได้อีกด้วย"

"อย่าพึ่งพาสิ่งนี้มากเกินไป ไม่ใช่ว่าทุกเธรดจะหยุดได้ แต่ถ้างานยังคงอยู่ในคิว การดำเนินการนี้จะทำงานได้ดี"

"ฉันชอบวิธีนี้ สะดวกกว่าการสร้างเธรดด้วยตัวเองแล้วพยายามดึงผลลัพธ์ออกมา"

"เยี่ยมมาก นั่นคือจุดที่เราจะสิ้นสุดในวันนี้"