ด้วยจำนวนคอร์ CPU ที่เพิ่มขึ้นจึงเป็นเรื่องที่หลีกเลี่ยงไม่ได้ที่จะใช้เทคโนโลยีมัลติเธรดเพื่อใช้ประโยชน์จากกำลังคอมพิวเตอร์อย่างเต็มที่ ดังนั้นเทคโนโลยีมัลติเธรดจึงเป็นเทคโนโลยีที่นักพัฒนาเซิร์ฟเวอร์ต้องควบคุม
การสร้างและการทำลายเธรดเกี่ยวข้องกับการเรียกใช้ระบบและใช้ทรัพยากรระบบดังนั้นเทคโนโลยีการรวมเกลียวจึงถูกนำมาใช้เพื่อหลีกเลี่ยงการสร้างเธรดและการทำลายบ่อยครั้ง
ใน Java มีคลาสเครื่องมือผู้บริหารที่สามารถสร้างพูลเธรดให้เราได้ สาระสำคัญคือใหม่วัตถุ Threadpoolexecutor สระว่ายน้ำเธรดเกือบจะต้องทำในคำถามสัมภาษณ์ ส่วนนี้รวมซอร์สโค้ดเพื่อพูดคุยเกี่ยวกับหลักการทำงานของ ThreadExecutor
1. การสร้างพูลเธรด
ก่อนอื่นให้ดูที่พารามิเตอร์ตัวสร้างที่สมบูรณ์ที่สุดของ ThreadPoolexecutor:
① Corepoolsize: จำนวนเธรดหลักในพูลเธรด เพื่อให้มันตรงไปตรงมาแม้ว่าจะไม่มีงานในสระว่ายน้ำเธรดจะมีเธรด corePoolsize ที่รองาน
②Maximumpoolsize: จำนวนเธรดสูงสุด ไม่ว่าคุณจะส่งงานกี่งานจำนวนมากที่สุดของเธรดคนงานในพูลเธรดจะมีขนาดสูงสุด
③ Keepalivetime: เวลาการอยู่รอดของเธรด เมื่อจำนวนเธรดในพูลเธรดมากกว่า corepoolsize หากไม่มีงานที่จะดำเนินการหลังจากรอ Keepalivetime เธรดจะออก
⑤unit: สิ่งนี้ใช้เพื่อระบุหน่วยของ Keepalivetime เช่นวินาที: TimeUnit.seconds
⑥ Workqueue: คิวการบล็อกและงานที่ส่งจะถูกวางไว้ในคิวนี้
⑦ ThreadFactory: โรงงานเธรดที่ใช้สร้างเธรดส่วนใหญ่เป็นชื่อเธรด ชื่อเธรดโรงงานเริ่มต้นคือ Pool-1-Thread-3
⑧handler: นโยบายปฏิเสธที่เรียกว่าเมื่อเธรดในพูลเธรดหมดและคิวเต็ม
ด้านบนเป็นพารามิเตอร์ที่ใช้เมื่อสร้างพูลเธรด ผู้สัมภาษณ์มักถามคำถามนี้ระหว่างการสัมภาษณ์
2. กระบวนการดำเนินการพูลเธรด
นี่คือไดอะแกรมเพื่อแสดงกระบวนการดำเนินการของพูลเธรด
เมื่องานถูกส่งไปยังพูลเธรดจะต้องพิจารณาก่อนว่าจำนวนเธรดปัจจุบันจะน้อยกว่า corePoolsize หรือไม่ หากน้อยกว่าเธรดจะถูกสร้างขึ้นเพื่อดำเนินการงานที่ส่ง มิฉะนั้นงานจะถูกใส่เข้าไปในคิวงาน หาก workqueue เต็มมันจะกำหนดว่าจำนวนเธรดปัจจุบันน้อยกว่า maximumpoolsize หรือไม่ หากน้อยกว่าเธรดจะถูกสร้างขึ้นเพื่อดำเนินการงาน มิฉะนั้นจะมีการเรียกตัวจัดการเพื่อระบุว่าพูลเธรดปฏิเสธที่จะรับงาน
ที่นี่ใช้ซอร์สโค้ดของ JDK1.8.0_111 เป็นตัวอย่างเพื่อดูการใช้งานเฉพาะ
1. ก่อนอื่นดูที่วิธีการใช้งานของพูลเธรด
①: ตรวจสอบว่าจำนวนเธรดที่ใช้งานปัจจุบันน้อยกว่า corePoolsize หรือไม่ หากน้อยกว่าการโทรหา addworker เพื่อสร้างเธรดเพื่อดำเนินการงาน
②: หากไม่น้อยกว่า corepoolsize ให้เพิ่มงานลงในคิวงาน
③: หากมีการใส่ Workqueue ลงใน Workqueue เธรดการสร้างจะดำเนินงาน หากเธรดการสร้างล้มเหลวในเวลานี้ (จำนวนเธรดปัจจุบันไม่น้อยกว่า maximumpoolsize) การปฏิเสธจะถูกเรียก (ตัวจัดการการโทรภายใน) และปฏิเสธที่จะยอมรับงาน
2. มาดูการใช้วิธี Addworker
รหัสชิ้นนี้คือเมื่อสร้างเธรดที่ไม่ใช่คอร์นั่นคือแกนเท่ากับเท็จ ตรวจสอบว่าจำนวนเธรดปัจจุบันมากกว่าหรือเท่ากับ maximumpoolsize หรือไม่ หากมากกว่าหรือเท็จเท็จนั่นคือการสร้างเธรดล้มเหลวใน③ที่กล่าวถึงข้างต้น
ครึ่งหลังของวิธี Addworker:
①สร้างวัตถุคนงานและสร้างอินสแตนซ์วัตถุเธรด
②เริ่มเธรดนี้
3. ไปหาคนงานเพื่อดูการใช้งาน
คุณจะเห็นว่า ThreadFactory ถูกเรียกเมื่อสร้างคนงานเพื่อสร้างเธรด การเริ่มต้นเธรดในด้านบน②จะทริกเกอร์วิธีการทำงานของคนงานที่จะเรียกโดยเธรด
4. ถัดไปมาดูตรรกะของวิธีการทำงาน
เธรดเรียก runwoker และจะเรียกวิธีการ getTask ในขณะที่วนซ้ำเพื่ออ่านงานจาก Workerqueue จากนั้นดำเนินงาน ตราบใดที่วิธีการ getTask ไม่ส่งคืนค่า null เธรดนี้จะไม่ออก
5. สุดท้ายมาดูการใช้วิธี getTask
①ขอให้ละเว้น lewldcorethreadtimeout ค่าเริ่มต้นของตัวแปรนี้เป็นเท็จ wc> corepoolsize กำหนดว่าจำนวนเธรดปัจจุบันมากกว่า corepoolsize หรือไม่
②หากจำนวนเธรดปัจจุบันมีค่ามากกว่า corepoolsize วิธีการสำรวจความคิดเห็นของการทำงานจะถูกเรียกให้รับงานและการหมดเวลาเป็น keepalivetime หากเวลาของ Keepalivetime เกินขีด จำกัด เวลาการสำรวจจะส่งกลับ NULL และขณะที่กล่าวถึงข้างต้นจะออกตามลำดับและเธรดจะถูกดำเนินการ
หากจำนวนเธรดปัจจุบันน้อยกว่า corepoolsize วิธีการใช้วิธีการทำงานจะถูกเรียกให้บล็อกในขณะนี้
บทความข้างต้นขึ้นอยู่กับหลักการทำงานและการตีความซอร์สโค้ดของพูลเธรด บทความนี้เป็นเนื้อหาทั้งหมดที่แชร์โดยโปรแกรมแก้ไข ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น