Runable, Callable, Future, FutureTask, ExecutorService, Excetor, Excutors และ ThreadPoolexCetor ใน Java สรุปคำหลักและการใช้งานเหล่านี้
จัดประเภทแรก:
สามารถเรียกใช้งานได้
อนาคต FutureTask
ExecutorService, excetor, excutors, threadpoolexcetor
1. เกี่ยวกับ ranable และ callable
ก่อนอื่นมีสามวิธีในการสร้างเธรดใน Java:
ข้อดีและข้อเสียของการใช้งานสามครั้ง:
เนื่องจากการสืบทอดเธรดคลาสอื่น ๆ ไม่สามารถสืบทอดได้และเธรดปัจจุบันสามารถรับได้
ใช้อินเทอร์เฟซที่เรียกใช้ได้ไม่มีค่าส่งคืนรับเธรดเธรดปัจจุบัน currentthread ()
ใช้อินเทอร์เฟซ callable คุณสามารถรับค่าส่งคืนผ่าน future.get () และรับเธรดเธรดปัจจุบัน currentthread ()
การสืบทอดเธรดสองขั้นตอน:
คลาส demothread ขยายเธรด {@Override โมฆะสาธารณะเรียกใช้ () {super.run (); // ดำเนินการใช้เวลานาน ... }} demothread t = demothread ใหม่ (); t.start ();เพื่อใช้งานได้โดยทั่วไปใช้ดังนี้:
เธรดใหม่ (ใหม่ runnable () {@Override โมฆะสาธารณะ run () {// ทำอะไร}}) เริ่มต้น ();เพื่อความเรียบง่าย
มันค่อนข้างลำบากที่จะได้รับผลลัพธ์ของการดำเนินการเธรดในสองวิธีข้างต้นและไม่สามารถรับได้โดยตรง JDK1.5 เพิ่มเมธอดการโทร () callable ของ Callable เพื่อส่งคืนค่าและโยนข้อยกเว้น Callable สามารถส่งคืนวัตถุในอนาคตที่โหลดด้วยผลการคำนวณ
ซอร์สโค้ด callable:
อินเทอร์เฟซสาธารณะ callable <v> {v call () โยนข้อยกเว้น;}การใช้งานพื้นฐานของ callable:
FutureTask <Integer> FutureTask = ใหม่ FutureTask <Integer> (ใหม่ callable <teeger> () {@Override การโทรสาธารณะสาธารณะ () โยนข้อยกเว้น {// ทำสิ่งที่ส่งคืน null;}}); เธรด = ใหม่ (futureTask); thread.start ()การเรียกใช้งานที่เรียกได้สามารถรับวัตถุในอนาคตและรับค่าส่งคืนที่ดำเนินการโดยเธรดผ่านวิธีการรับ () ในอนาคต แล้ว ... อนาคต
ความแตกต่างระหว่าง FutureTask และวิธีการใช้งานคืออะไร?
-> ถัดไป ()
2. เกี่ยวกับอนาคตและ FutureTask
เพื่อให้ได้ผลลัพธ์การดำเนินการของเธรด FutureTask ของอนาคตได้รับการแนะนำ แล้วความสัมพันธ์ของพวกเขาคืออะไรและใช้อย่างไร?
คลาส Future ตั้งอยู่ภายใต้แพ็คเกจ java.util.concurrent ซึ่งเป็นอินเทอร์เฟซ:
อินเทอร์เฟซสาธารณะในอนาคต <v> {บูลีนยกเลิก (บูลีน Mayinterruptifrunning); บูลีน iscancelled (); บูลีน iSdone (); v get () พ่น InterruptedException, ExecutionException; V Get (Long Timeout, TimeUnit Unit) พ่น InterruptedException, ExecutionException, TimeOutException;}อนาคตกำหนด 5 วิธี:
1) บูลีนยกเลิก (บูลีน Mayinterruptifrunning): พยายามยกเลิกการดำเนินการของงานนี้ หากงานเสร็จสมบูรณ์หรือถูกยกเลิกหรือไม่สามารถยกเลิกได้ด้วยเหตุผลอื่น ๆ ความพยายามนี้จะล้มเหลว เมื่อถูกยกเลิก () เรียกว่าหากการโทรสำเร็จและงานยังไม่ได้เริ่มงานงานจะไม่ทำงาน หากงานเริ่มต้นพารามิเตอร์ Mayinterruptifrunning จะกำหนดว่าเธรดที่ดำเนินการงานควรถูกขัดจังหวะในลักษณะที่พยายามหยุดงานหรือไม่ หลังจากวิธีการนี้ส่งคืนการโทรไปยัง iSdone () ที่ตามมาจะส่งคืนจริงเสมอ หากวิธีนี้ส่งคืนจริงการโทรไปยัง iscancelled () ในภายหลังจะส่งคืนจริงเสมอ
2) บูลีน iscancelled (): ส่งคืนจริงถ้างานถูกยกเลิกก่อนที่จะเสร็จสิ้นตามปกติ
3) บูลีน iSdone (): ส่งคืนจริงหากงานเสร็จสมบูรณ์ สิ่งนี้อาจทำได้เนื่องจากการเลิกจ้างปกติข้อยกเว้นหรือการยกเลิกในทุกกรณีวิธีนี้จะกลับมาเป็นจริง
4) v get () พ่น InterruptedException, ExecutionException: หากจำเป็นให้รอการคำนวณที่จะเสร็จสิ้นแล้วรับผลลัพธ์
5) V Get (Long Timeout, TimeUnit Unit) พ่น InterruptedException, ExecutionException, TimeoutException: หากจำเป็นให้รอมากที่สุดหลังจากเวลาที่กำหนดเพื่อทำการคำนวณให้เสร็จสมบูรณ์และรับผลลัพธ์ (หากผลลัพธ์นั้นมีอยู่)
โดยทั่วไปอนาคตมีสามฟังก์ชั่น:
ตรวจสอบว่างานเสร็จสมบูรณ์หรือไม่
ความสามารถในการขัดจังหวะงาน
สามารถรับผลการปฏิบัติงานได้
ประเด็นสำคัญ:
RunnableFuture สืบทอดอินเทอร์เฟซ Runnable และอินเทอร์เฟซในอนาคตในขณะที่ FutureTask ใช้อินเทอร์เฟซ RunnableFuture
การใช้งาน FutureTask:
Public Class FutureTask <v> ใช้ RunnableFuture <v>
การใช้งานอินเตอร์เฟส RunnableFuture:
อินเทอร์เฟซสาธารณะ runnablefuture <v> ขยาย runnable, future <v> {void run ();}FutureTask เป็นคลาสการใช้งานที่ไม่ซ้ำกันของอินเทอร์เฟซในอนาคต
นอกเหนือจากการห่อ futureTask ด้วยเธรดแล้วยังมีอีกวิธีหนึ่งในการใช้งาน:
ExecutorService Executor = Executors.newCachedThreadPool (); FutureTask <Integer> FutureTask = New FutureTask <Integer> (ใหม่ callable <teeger> () {@Override การโทรสาธารณะ FutureTask.get (); เฟรมเวิร์กผู้บริหารใช้ที่นี่
-> ถัดไป ();
3. เกี่ยวกับ ExecutorService, Excetor, Excutors, ThreadPoolexCetor
Framework ผู้บริหารได้รับการแนะนำใน Java 5. Framework Executor เป็นกรอบการทำงานที่ดำเนินการงานแบบอะซิงโครนัสที่เรียกใช้การเรียกใช้นโยบายกำหนดเวลาการดำเนินการและการควบคุม
ก่อนที่จะพูดคุยเกี่ยวกับเฟรมเวิร์กผู้บริหารเราจำเป็นต้องแนะนำแนวคิดใหม่ - ThreadPoolexecutor:
Public Threadpoolexecutor (intcorepoolsize, int maximumpoolsize, regalivetime ยาว, unit timeunit, blockingqueue <runnable> workqueue, ThreadFactory ThreadFactory, Handler Handler ที่ถูกปฏิเสธ
Threadpoolexecutor เป็นการใช้งานพื้นฐานของคลาส Executors
ในเอกสารช่วยเหลือ JDK มีข้อความ:
"ขอแนะนำอย่างยิ่งให้โปรแกรมเมอร์ใช้วิธีการของผู้ดำเนินการโรงงานที่สะดวกยิ่งขึ้น NewCachedThreadpool () (พูลเธรดที่ไม่ได้ จำกัด ซึ่งสามารถทำการรีไซเคิลเธรดอัตโนมัติ), Executors.NewFixedThreadPool (int) (int) (int) สถานการณ์ "
แล้ว ExecutorService, Excetor และ Excutors คืออะไร?
Excetor เป็นอินเทอร์เฟซหลักในระดับนามธรรม:
อินเทอร์เฟซ Public Executor {Void Execute (คำสั่ง runnable);}อินเทอร์เฟซ ExecutorService ขยายอินเทอร์เฟซ Executor และให้วิธีการเช่นการส่งคืนวัตถุในอนาคตการสิ้นสุดการปิดพูลเธรด ฯลฯ
ส่วนต่อประสานสาธารณะ ExecutorService ขยาย Executor {Void Shutdown (); <t> อนาคต <t> ส่ง (งานเรียกได้ <t>); <t> อนาคต <T> ส่ง (งานที่รันได้ผลลัพธ์ t); <t> รายการ <Future <t>> Invokeall (คอลเลกชัน <? ขยายงานที่เรียกได้ <t>>, การหมดเวลายาว, หน่วยเวลา) พ่น InterruptedException;}Executors เป็นคลาสเครื่องมือที่คล้ายกับคอลเลกชัน จัดเตรียมวิธีการจากโรงงานเพื่อสร้างพูลเธรดประเภทต่าง ๆ เช่น recidethreadpool หรือ cachedthreadpool
ผู้บริหารระดับสาธารณะ {Public Static ExecutorService newFixedThreadPool (int nthreads) {ส่งคืน ThreadPoolexecutor ใหม่ (nthreads, nthreads, 0l, timeunit.milliseconds, LinkedBlockingQueue ใหม่ <runnable> (); } public executorService newCachedThreadPool () {ส่งคืน ThreadPoolexecutor ใหม่ (0, Integer.max_value, 60L, TimeUnit.seconds, ใหม่ synchronousqueue <runnable> ()); -ข้างต้นเป็นการรวบรวมคำหลักแบบมัลติเธรด Java ดังนั้นมันจะไม่ยุ่ง
ข้างต้นคือการใช้งานการเรียงลำดับคำหลักแบบมัลติเธรดใน Java ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!