แพ็คเกจ java.util.concurrent ให้คลาสเกี่ยวกับการดำเนินการแบบมัลติเธรด คนที่ใช้กันทั่วไปคือ ExecutorService และคลาสการใช้งาน (เช่น Threadpoolexecutor ฯลฯ ) ผู้บริหารผู้บริหารในอนาคต callable ฯลฯ
1. ExecutorService (สืบทอดมาจากอินเทอร์เฟซ Executor): ให้วิธีการทำงานแบบหลายเธรดแบบอะซิงโครนัสบางอย่างเช่น execute (), ส่ง (), shutdown (), shutdownnow () ฯลฯ
2. อินเทอร์เฟซ Executor: ดำเนินการงานที่ส่ง (เธรด) โดยมีวิธีการเดียวเท่านั้นที่ดำเนินการ (Runnable A)
2. คลาสผู้บริหาร: ให้วิธีการโรงงานและวิธีการสาธารณะบางอย่างในการใช้งานคลาสย่อยของผู้บริหารและ ThreadFactory ฯลฯ เช่น newxxx (), xxxThreadFactory () ฯลฯ ฯลฯ
3. อินเตอร์เฟส Futrue: แสดงผลการดำเนินการเธรดให้วิธีการรับผลการดำเนินการเธรดและยกเลิกเธรดเช่น Get (), CanCle () ฯลฯ
4. อินเตอร์เฟส callable: เธรดที่มีค่าส่งคืนจัดทำโดย JDK1.5 เพื่อดำเนินการอินเตอร์เฟสใหม่
สร้างบันทึกง่าย ๆ เกี่ยวกับความเข้าใจของ ExecutorService และอนาคต
รหัส:
ชั้นเรียนสาธารณะหลัก {จำนวน int คงที่ส่วนตัว = 0; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {รายการ <future> resultList = ใหม่ linkedList <> (); /*** executors.newcachedthreadpool () สร้างพูลแคชเธรด หากไม่ได้ใช้เธรดใน 60s เธรดจะถูกหยุดและลบออกจากแคชพูล* executors.newscheduledThreadpool () สร้างพูลเธรดที่มีความจุคงที่และเธรดภายในจะดำเนินการตามเวลาที่กำหนด หนึ่งเธรด*/ ExecutorService ExecutorService = Executors.newCachedThreadPool (); สำหรับ (int i = 0; i <10; i ++) {future future = executoRservice.submit (ใหม่ callable <string> () {@Override การเรียกสตริงสาธารณะ () {ลอง {system.out.println (thread.currentThread () {intertExtract = Main.count; resultlist.add (อนาคต); } ExecutorService.shutdown (); สำหรับ (อนาคตในอนาคต: ผลลัพธ์) {ลอง {system.out.println (future.get () + ".. คือมากกว่า ... "); } catch (interruptedException e) {e.printStackTrace (); } catch (ExecutionException E) {E.printStackTrace (); }} System.out.println ("Main Thread End ... "); -เอาท์พุท:
pool-1-thread-1pool-1-thread-2pool-1-Thread-3pool-1-Thread-4pool-1-Thread-5pool-1-Thread-6pool-1-Thread-7pool-1-Thread-8pool-thread-9pool-thread-10pool-1-thread-1 จำนวนหลัก: ... 1Pool-1-Thread-2..end หลักจำนวน: ... 1Pool-1-Thread-1..end หลักจำนวน: ... 1Pool-1-Thread-3 .. การนับหลัก: ... 1Pool-1-Thread-2 .. การนับหลัก: ... 1Pool-1-Thread-1 .. เหนือ ... Pool-1-Thread-4 .. เริ่มต้นหลัก: ... 2Pool-1-Thread-3 .. กำลังมากกว่า ... Pool-1-Thread-4 .. การนับหลัก: ... 3Pool-1-Thread-4 .. กำลังมากกว่า ... Pool-1-Thread-5 .. เริ่มต้น: ... 3Pool-1-Thread-5 นับ: ... 4Pool-1-Thread-6..end หลักจำนวน: ... 4Pool-1-Thread-6..end หลักนับ: ... 4Pool-1-Thread-6..end หลักนับ: ... 4Pool-1-Thread-6 .. การนับหลัก: ... 4Pool-1-Thread-6 .. นับ: ... 6Pool-1-Thread-7 .. กำลังมากกว่า ... Pool-1-Thread-8 .. เริ่มต้นหลัก: ... 6Pool-1-Thread-8 .. การนับหลัก: ... 7Pool-1-Thread-8 .. กำลังมากกว่า ... Pool-1-thread-9 .. การนับหลัก: ... 7Pool-1-Thread-9 นับ: ... 7Pool-1-Thread-9 .. การนับหลัก: ... 8Pool-1-Thread-9 .. กำลังมากกว่า ... Pool-1-Thread-10 .. เริ่มต้นนับหลัก: ... 8Pool-1-Thread-9 .. กำลังมากกว่า ... Pool-1-Thread -10 .. เริ่มต้น ...
คอนโซลพิมพ์ผลลัพธ์ผลลัพธ์ด้านบนหลังจากรอ 5 วินาที เหตุผลก็คือเมื่อเธรดทั้งหมดเริ่มต้นมันเป็นการดำเนินการที่เกิดขึ้นพร้อมกันและจะรอ 5 วินาที โดยรวมแล้วดูเหมือนว่าจะรอเพียง 5 วินาทีเท่านั้น นี่คือการดำเนินการพร้อมกัน
สรุป:
1. ความแตกต่างระหว่างวิธี การดำเนินการ () และวิธี การส่ง () ที่จัดทำโดย ExecutorService:
. วิธีการดำเนินการ () ยอมรับเฉพาะอินสแตนซ์ของประเภท runnable ดังนั้นจึงไม่สามารถรับค่าคืนได้และไม่สามารถรับสถานการณ์การดำเนินการเธรดได้แบบไดนามิก
ข. วิธีการส่ง () ยอมรับอินสแตนซ์ที่เรียกใช้และเรียกได้และจะส่งคืนอินสแตนซ์ในอนาคต เมธอด Get () ของอินสแตนซ์ในอนาคตสามารถรับค่าส่งคืนเธรดการดำเนินการและโยนข้อยกเว้นการดำเนินการเธรด ดังนั้นหากคุณต้องการให้ผลลัพธ์ที่ส่งคืนโดยการดำเนินการเธรดและสามารถจัดการข้อยกเว้นที่เป็นไปได้ระหว่างการดำเนินการเธรดหรือหากคุณต้องการยกเลิกการดำเนินการเธรดตรงกลางคุณสามารถใช้วิธีการส่ง ()
2. ผ่านเอาต์พุตคุณจะเห็นว่าวิธีการหลัก (เธรดหลัก) สิ้นสุดลงหลังจากเธรดทั้งหมดเสร็จสิ้นการดำเนินการเสร็จสิ้น เหตุผล:
. รับอินสแตนซ์ในอนาคตผ่านวิธีการส่ง () และรับผลการส่งคืนเธรดผ่านวิธีการรับ () ของอินสแตนซ์ในอนาคต เมธอด Get () ของอินสแตนซ์ในอนาคตจะรอให้เธรดดำเนินการก่อนที่จะกลับมาดังนั้นวิธีหลักจะรอให้เธรดเด็กทั้งหมดสิ้นสุดก่อนที่จะสิ้นสุด
ข. หากการวนรอบที่ทำเครื่องหมายด้วยสีแดงด้านบนจะถูกลบออกวิธีการหลัก (เธรดหลัก) จะสิ้นสุดเร็วโดยไม่ต้องรอเธรดเด็กทั้งหมดให้สิ้นสุด
เติมเต็ม:
1. เมื่อหลายเธรดดำเนินการพร้อมกันหากมีข้อยกเว้นเกิดขึ้นในหนึ่งในเธรดและไม่ได้ประมวลผลเธรดจะหยุดการดำเนินการโดยอัตโนมัติ แต่เธรดอื่น ๆ จะยังคงดำเนินการตามปกติ นี่คือเหตุผลที่ Tomcat สามารถให้บริการต่อไปได้เมื่อมีข้อยกเว้นเกิดขึ้นในคำขอ Tomcat
2. Tomcat มีสระว่ายน้ำและสระว่ายน้ำรอ แต่ละคำขอจะรีสตาร์ทเธรดใหม่เพื่อดำเนินการตามคำขอ หากเธรดในพูลเธรดหมดจะถูกใส่ลงในสระว่ายน้ำรอและรอ เมื่อเธรดถูกปล่อยกลับเข้าสู่พูลเธรดเธรดจะถูกกำหนดให้ประมวลผลคำขอในพูลรอ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น