อินเทอร์เฟซ callable และอนาคต
Callable เป็นอินเทอร์เฟซที่คล้ายกับ Runnable
มีความแตกต่างกันหลายประการระหว่างการเรียกและเรียกใช้:
(1) วิธีการที่ระบุโดย callable คือ call () ในขณะที่วิธีการที่ระบุโดย runnable คือ run ()
(2) งานที่เรียกได้สามารถส่งคืนค่าหลังจากดำเนินการในขณะที่งาน runnable ไม่สามารถส่งคืนค่าได้
(3) วิธีการโทร () สามารถโยนข้อยกเว้นได้ในขณะที่วิธีการเรียกใช้ () ไม่สามารถโยนข้อยกเว้นได้
(4) เรียกใช้งานที่เรียกได้และคุณสามารถรับวัตถุในอนาคตได้
มันมีวิธีการตรวจสอบว่าการคำนวณเสร็จสมบูรณ์หรือไม่เพื่อรอให้การคำนวณเสร็จสมบูรณ์และเพื่อดึงผลลัพธ์ของการคำนวณ
ผ่านวัตถุในอนาคตคุณสามารถเข้าใจสถานะการปฏิบัติงานของงานยกเลิกการปฏิบัติงานและยังได้รับผลลัพธ์ของการดำเนินงาน
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.yo;
นำเข้า java.util.concurrent.callable;
นำเข้า java.util.concurrent.executorservice;
นำเข้า java.util.concurrent.executors;
นำเข้า java.util.concurrent.future;
คลาสสาธารณะ callableandfuture {
-
* ปรับแต่งคลาสงานเพื่อใช้งานอินเตอร์เฟสที่เรียกได้
-
คลาสสแตติกสาธารณะ MyCallableClass ใช้ callable {
// ตำแหน่งโลโก้
ธง int ส่วนตัว = 0;
สาธารณะ myCallableClass (int flag) {
this.flag = Flag;
-
การเรียกสตริงสาธารณะ () โยนข้อยกเว้น {
if (this.flag == 0) {
// หากค่าของธงเป็น 0 ให้ส่งคืนทันที
return "flag = 0";
-
if (this.flag == 1) {
// ถ้าค่าของธงคือ 1 ให้ทำลูปที่ไม่มีที่สิ้นสุด
พยายาม {
ในขณะที่ (จริง) {
System.out.println ("วนซ้ำ ... ");
Thread.sleep (2000);
-
} catch (interruptedException e) {
System.out.println ("ขัดจังหวะ");
-
กลับ "เท็จ";
} อื่น {
// ถ้าเท็จไม่ใช่ 0 หรือ 1 จะมีการโยนข้อยกเว้น
โยนข้อยกเว้นใหม่ ("ค่าธงไม่ดี!");
-
-
-
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
// กำหนด 3 ประเภทที่เรียกได้
MyCallableClass task1 = ใหม่ MyCallableClass (0);
MyCallableClass task2 = ใหม่ myCallableClass (1);
MyCallableClass task3 = ใหม่ MyCallableClass (2);
// สร้างบริการที่ทำงาน
ExecutorService ES = Executors.NewFixedThreadPool (3);
พยายาม {
// ส่งและดำเนินการงาน
// หากคุณต้องการได้รับผลลัพธ์จากการดำเนินงานหรือข้อยกเว้นคุณสามารถใช้งานกับวัตถุในอนาคตนี้ได้
อนาคตในอนาคต 1 = es.submit (task1);
// รับผลลัพธ์ของงานแรก
System.out.println ("task1:" + future1.get ());
Future Future2 = es.submit (task2);
// รอ 5 วินาทีก่อนหยุดงานที่สอง เพราะงานที่สองคือวงไม่มีที่สิ้นสุด
Thread.sleep (5000);
System.out.println ("task2 ยกเลิก:" + future2.cancel (true));
// รับเอาต์พุตของงานที่สามเนื่องจากการดำเนินงานที่สามจะทำให้เกิดข้อยกเว้น
// ดังนั้นคำสั่งต่อไปนี้จะทำให้เกิดข้อยกเว้นที่จะโยน
Future Future3 = es.submit (task3);
System.out.println ("task3:" + future3.get ());
} catch (Exception e) {
System.out.println (e.toString ());
-
// หยุดบริการงาน
es.shutdownnow ();
-
-