Java Thread Pool ExecutorService
1. พูลเธรด
1.1 คุณใช้พูลเธรดในสถานการณ์ใดบ้าง?
1.2 ประโยชน์ของการใช้พูลเธรด
2. Executorservice และผู้บริหาร
2.1 บทนำ
ExecutorService เป็นอินเทอร์เฟซที่สืบทอด Executor
ส่วนต่อประสานสาธารณะ ExecutorService ขยาย Executor {}Executor ยังเป็นอินเทอร์เฟซซึ่งมีเพียงวิธีเดียวเท่านั้น:
อินเทอร์เฟซ Public Executor {Void Execute (คำสั่ง runnable);} อินเทอร์เฟซระดับบนสุดของพูลเธรดใน Java คือ excutor แต่พูดอย่างเคร่งครัด >> Exector ไม่ใช่พูลเธรด แต่เป็นเพียงเครื่องมือสำหรับการดำเนินการเธรด เธรดจริง> อินเทอร์เฟซพูลคือ ExecutorService
3. ผู้สอน
มันเป็นคลาสโรงงานคงที่ซึ่งสามารถสร้างพูลเธรดประเภทต่าง ๆ และบางส่วนของซอร์สโค้ดมีดังนี้:
ผู้บริหารระดับสาธารณะ {// newfixedThreadPoolpublic executorService newfixedthreadpool (int nthreads) {ส่งคืน ThreadPoolexecutor ใหม่ (nthreads, nthreads, 0l, timeUnit.milliseconds, LinkedBlockingQueue newCachedThreadPool () {ส่งคืน ThreadPoolexecutor ใหม่ (0, Integer.max_value, 60L, TimeUnit.seconds, Synchronousqueue ใหม่ <Runnable> ()); } // NewscheduledThreadPool สาธารณะคงที่ scheduledExecutorservice NewscheduledThreadPool (int corepoolsize) {ส่งคืนใหม่ ScheduledThreadPoolexecutor (CorePoolsize); } // Newstringooo}ก่อนอื่นให้ดูตัวอย่างที่เฉพาะเจาะจงและใช้ตัวอย่างเพื่อแสดงความเหมือนและความแตกต่างระหว่างพวกเขา
แพ็คเกจเธรด; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; นำเข้า java.util.concurrent.scheduledexecutorservice;/*** สร้างโดย Yang เมื่อวันที่ 16-7-11 */คลาสสาธารณะ CH09_EXECUTOR {โมฆะแบบคงที่ส่วนตัว (ExecutORSERVICE ThreadPool) {สำหรับ (int i = 1; i <5; i ++) {สุดท้าย int taskId = i; threadpool.execute (ใหม่ runnable () {@Override โมฆะสาธารณะเรียกใช้ () {สำหรับ (int i = 1; i <5; i ++) {ลอง {thread.sleep (20);} catch (interruptedException e) {e.printstacktrace (); threadpool.shutdown ();} โมฆะคงที่สาธารณะ (สตริง [] args) {// สร้างพูลเธรดที่สามารถรองรับ 3 เธรด ExecutorService implemtHreadPool = Executors.newFixedThreadPool (3); // สร้างพูลเธรดของเธรดเดียว // run (recidethreadpool); // (2) // run (singlethreadpool); // (3) // run (scheduledThreadPool); // (4)}}4. 4 พูลเธรดที่ใช้กันทั่วไป
4.1 Cachedthreadpool
CachedThreadPool จะสร้างพื้นที่แคชที่แคชเธรดที่เริ่มต้นสิ้นสุดลงและลบเธรดที่ไม่ได้ใช้เป็นเวลา 6 วินาทีจากแคช
หากเธรดพร้อมใช้งานให้ใช้เธรดที่สร้างขึ้นก่อนหน้านี้ หากเธรดไม่พร้อมใช้งานให้สร้างเธรดใหม่
. reuse:
พูลประเภทแคชก่อนอื่นตรวจสอบว่ามีเธรดที่สร้างขึ้นในพูลหรือไม่ หากมีหนึ่งการใช้ซ้ำ หากไม่มีใครสร้างเธรดใหม่และเพิ่มลงในพูล
ใช้สถานการณ์:
Cache Pools มักจะใช้ในการทำงานแบบอะซิงโครนัสที่มีอายุการใช้งานสั้น ๆ ดังนั้นพวกเขาจึงไม่ได้ใช้มากในเซิร์ฟเวอร์ประเภท daemon ที่มุ่งเน้นการเชื่อมต่อ
หมดเวลา:
เธรดที่สามารถนำกลับมาใช้ใหม่จะต้องเป็นเธรดในพูลภายในไม่ได้ใช้งานหมดเวลา การหมดเวลาเริ่มต้นคือ 60s หากระยะเวลาของการไม่ได้ใช้งานนี้เกินกว่าอินสแตนซ์เธรดจะถูกยกเลิกและสระจะถูกลบออก
เสร็จ:
เธรดที่ใส่ลงใน CachedThreadPool ไม่ต้องกังวลเกี่ยวกับจุดจบของมัน หากไม่ได้ใช้งานหลังหมดเวลาจะถูกยกเลิกโดยอัตโนมัติ
ตัวอย่างคำอธิบาย:
ลบความคิดเห็นของ (2) และเรียกใช้ ผลลัพธ์ของการดำเนินการมีดังนี้:
ครั้งแรกของงานแรกครั้งที่สามของงานที่สามเป็นครั้งที่สามของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองครั้งที่สองของครั้งที่สองของครั้งที่สองครั้งที่สองของครั้งที่สอง เวลาของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองครั้งที่สองของครั้งที่สองของครั้งที่สองครั้งที่สองของครั้งที่สองครั้งที่สองของครั้งที่สอง ครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองครั้งที่สองของครั้งที่สองครั้งที่สอง ครั้งที่สี่ของครั้งที่สี่ของงานแรกเป็นครั้งที่สี่ของครั้งที่สี่ของงานแรกครั้งที่สี่ของครั้งที่สี่ของงานแรกครั้งที่สี่ของครั้งที่สี่ของงานที่สี่ครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ ครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของงานแรกเป็นครั้งที่สี่ของครั้งที่สี่ของงานแรกครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของงานแรกเป็นครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของงานแรก
จากผลลัพธ์จะเห็นได้ว่า 4 งานจะถูกดำเนินการสลับกัน
4.2fixedthreadpool
ใน recideThreadpool มีพูลขนาดคงที่
หากงานในปัจจุบันจำเป็นต้องดำเนินการเกินขนาดพูลงานจำนวนมากที่ส่งออกอยู่ในสถานะรอจนกว่าจะมีเธรดฟรีเพื่อดำเนินการงาน
หากงานที่จำเป็นต้องดำเนินการในปัจจุบันมีขนาดเล็กกว่าขนาดพูลเธรดที่ไม่ได้ใช้งานจะไม่ถูกทำลาย
นำกลับมาใช้ใหม่:
ExpiedThreadPool นั้นคล้ายกับ CachetHreadPool และสามารถใช้งานได้หากสามารถนำมาใช้ซ้ำได้ แต่คุณไม่สามารถสร้างเธรดใหม่ได้ตลอดเวลา
หมายเลขคงที่
ความเป็นเอกลักษณ์ของมันคือเมื่อใดก็ตามที่จุดใด ๆ สามารถมีเธรดที่ใช้งานได้จำนวนคงที่เท่านั้น ในเวลานี้หากมีเธรดใหม่ที่จะสร้างขึ้นจะสามารถวางไว้ในคิวอื่นและรอจนกว่าเธรดในเธรดปัจจุบันจะสิ้นสุดลงและถูกย้ายออกจากพูลโดยตรง
หมดเวลา:
ซึ่งแตกต่างจาก cachethreadpool, recidethreadpool ไม่มีกลไกที่ไม่ได้ใช้งาน
ใช้สถานการณ์:
ดังนั้นส่วนใหญ่ที่มีการแก้ไขจะมีจุดมุ่งหมายที่เธรดที่เกิดขึ้นพร้อมกันทั่วไปและคงที่บางอย่างและส่วนใหญ่จะใช้ในเซิร์ฟเวอร์
การวิเคราะห์ซอร์สโค้ด:
ตัดสินจากซอร์สโค้ดของวิธีการพูลแคชและพูลคงที่เรียกว่าพูลพื้นฐานเดียวกัน แต่พารามิเตอร์แตกต่างกัน
จำนวนเธรดพูลคงที่ได้รับการแก้ไขและไม่ได้ใช้งาน 0 วินาที (ไม่ว่าง)
จำนวนเธรดพูลแคชรองรับ 0-integer.max_value (เห็นได้ชัดว่าการยอมรับทรัพยากรของโฮสต์ไม่ได้รับการพิจารณาเลย) 60 วินาทีใช้งานไม่ได้
ตัวอย่างคำอธิบาย:
ลบความคิดเห็นของ (1) และผลการทำงานมีดังนี้:
ครั้งแรกของงานแรกเป็นครั้งที่สามของครั้งที่สามของงานแรกครั้งที่สามของครั้งที่สองของงานที่สองครั้งที่สามของครั้งที่สองของครั้งที่สองของงานที่สองครั้งที่สามของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองครั้งที่สองของครั้งที่สองครั้งที่สองของครั้งที่สองครั้งที่สองของครั้งที่สองครั้งที่สอง เวลาของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สองของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ ครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ เป็นครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ ครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ของครั้งที่สี่ เป็นครั้งที่สี่
พูลเธรดขนาดคงที่ถูกสร้างขึ้นด้วยความจุ 3 และจากนั้น 4 งานถูกดำเนินการในลูป จากผลลัพธ์ผลลัพธ์จะเห็นได้ว่างาน 3 ชิ้นแรกถูกดำเนินการก่อนจากนั้นเธรดที่ไม่ได้ใช้งานจะทำภารกิจที่สี่
4.3SingLetHreadExecutor
ลบ (3) ความคิดเห็น ดูผลการดำเนินการดังนี้:
ภารกิจแรกของงานแรกของงานแรกของงานที่สองของงานแรกของงานที่สามของงานแรกของงานที่สี่ของงานที่สองของงานที่สองของงานที่สองของงานที่สองของงานที่สองของงานที่สองของภารกิจที่สี่ของงานที่สี่ของงานที่สี่ของงานที่สี่ ภารกิจที่สี่ของภารกิจที่สี่ของงานที่สี่ของงานที่สี่ของงานที่สี่ของงานที่สี่ของภารกิจที่สี่ของงานที่สี่ของงานที่สี่ของงานที่สี่ของงานที่สี่ของภารกิจที่สี่ของภารกิจที่สี่ของภารกิจที่สี่ของภารกิจที่สี่
งานทั้งสี่จะดำเนินการตามลำดับ
4.4 ScheduleDTHREADPOOL
ScheduledThreadPool เป็นพูลเธรดขนาดคงที่ เช่นเดียวกับ recidethreadpool งานที่ดำเนินการเป็นงานที่กำหนดเวลา
ผลลัพธ์ที่ได้จากการลบคำอธิบายประกอบของ (4) นั้นเหมือนกับผลลัพธ์ที่ได้จาก recidethreadpool เหตุผลหลักสำหรับ ScheduledThreadPool ไม่ได้อยู่ที่นี่ แต่เป็นงานที่กำหนดเวลา ดูตัวอย่างต่อไปนี้:
แพ็คเกจเธรด; นำเข้า java.util.concurrent.executors; นำเข้า java.util.concurrent.scheduledexecutorservice; นำเข้า java.util.concurrent.timeUnit;/*** สร้างโดย Yang เมื่อวันที่ 16-7-11 */คลาสสาธารณะ MyscheduledTask ใช้งาน Runnable {สตริงส่วนตัว tname; สาธารณะ myscheduledTask (ชื่อสตริง) {this.tname = name; } โมฆะสาธารณะเรียกใช้ () {System.out.println (tname+"การดำเนินการล่าช้างาน 2 วินาที!"); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {scheduleDexecutorservice scheduledPool = executors.newscheduledThreadPool (2); ScheduleDexecutorservice singschedulepool = executors.newsinglethreadscheduledexecutor (); MyscheduledTask MT1 = New MyscheduledTask ("MT1"); MyscheduledTask MT2 = MyscheduledTask ใหม่ ("MT2"); // เริ่มงาน MT1 ด้วย ScheduleDTHREADPOOL เพื่อดำเนินการ ScheduledPool.Schedule (MT1,2, TimeUnit.Seconds); // เริ่ม MT2 ด้วย SinglescheduledThreadPool; Singschedulepool.schedule (MT2,2000, TimeUnit.milliseconds); scheduledpool.shutdown (); singschedulepool.shutdown (); -ผลลัพธ์:
งาน MT1 ล่าช้า 2 วินาทีในการดำเนินการ! งาน MT2 ล่าช้า 2 วินาทีในการดำเนินการ!
ผลลัพธ์จะไม่ปรากฏหลังจากโปรแกรมทำงานเป็นเวลา 2 วินาทีซึ่งบ่งชี้ว่าเธรดถูกดำเนินการหลังจาก 2 วินาที
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!