หนึ่งจะใช้ threadpool ได้อย่างไร ฉันได้อ่านวิกิพีเดียเกี่ยวกับ "threadpool" แต่ฉันก็ยังไม่สามารถคิดได้ว่าสิ่งใดที่ควรทำเพื่อแก้ปัญหานี้
ใครช่วยอธิบายฉันเป็นภาษาอังกฤษธรรมดาว่า threadpool คืออะไรและใครจะตอบคำถามนี้ได้บ้าง?
หนึ่งจะใช้ threadpool ได้อย่างไร ฉันได้อ่านวิกิพีเดียเกี่ยวกับ "threadpool" แต่ฉันก็ยังไม่สามารถคิดได้ว่าสิ่งใดที่ควรทำเพื่อแก้ปัญหานี้
ใครช่วยอธิบายฉันเป็นภาษาอังกฤษธรรมดาว่า threadpool คืออะไรและใครจะตอบคำถามนี้ได้บ้าง?
คำตอบ:
กลุ่มเธรดคือกลุ่มของเธรดที่ไม่ได้ใช้งานล่วงหน้าซึ่งพร้อมใช้งาน สิ่งเหล่านี้เป็นที่ต้องการมากกว่าการสร้างเธรดใหม่สำหรับแต่ละงานเมื่อมีงานสั้นจำนวนมากที่ต้องทำแทนที่จะเป็นงานจำนวนน้อย สิ่งนี้ป้องกันไม่ให้เกิดค่าใช้จ่ายในการสร้างเธรดเป็นจำนวนมากครั้ง
การปรับใช้จะแตกต่างกันตามสภาพแวดล้อม แต่ในแง่ง่ายคุณต้องมีสิ่งต่อไปนี้:
Task
กับexecute()
วิธีการที่จะทำงานแล้วผลตอบแทนเมื่อสร้างเธรดพูลเธรดจะสร้างอินสแตนซ์ของเธรดจำนวนหนึ่งเพื่อให้พร้อมใช้งานหรือสร้างเธรดใหม่ตามต้องการขึ้นอยู่กับความต้องการของการนำไปใช้
เมื่อส่งมอบพูล a Task
จะใช้เธรดจากคอนเทนเนอร์ (หรือรอให้มีพูลว่างหากคอนเทนเนอร์ว่าง) ส่ง a Task
และตรงกับสิ่งกีดขวาง สิ่งนี้ทำให้เธรดที่ไม่ได้ทำงานดำเนินการต่อโดยเรียกใช้execute()
เมธอดที่Task
ได้รับ เมื่อการดำเนินการเสร็จสิ้นเธรดจะส่งกลับไปยังพูลเพื่อนำไปใช้ในคอนเทนเนอร์อีกครั้งเพื่อใช้งานอีกครั้งจากนั้นเข้าสู่สิ่งกีดขวางทำให้ตัวเองเข้าสู่โหมดสลีจนกระทั่งวงจรซ้ำ
เธรดพูลคือชุดของเธรดที่ได้รับการจัดการซึ่งมักจะจัดระเบียบในคิวซึ่งดำเนินการงานในคิวงาน
การสร้างวัตถุเธรดใหม่ทุกครั้งที่คุณต้องการสิ่งที่จะดำเนินการแบบอะซิงโครนัสมีราคาแพง ในเธรดพูลคุณเพียงแค่เพิ่มงานที่คุณต้องการให้ดำเนินการแบบอะซิงโครนัสกับคิวงานและเธรดพูลดูแลการกำหนดเธรดที่พร้อมใช้งานถ้ามีสำหรับงานที่เกี่ยวข้อง ทันทีที่งานเสร็จสิ้นเธรดที่พร้อมใช้งานในขณะนี้จะร้องของานอื่น (สมมติว่ามีสิ่งใดเหลืออยู่)
กลุ่มเธรดช่วยให้คุณหลีกเลี่ยงการสร้างหรือทำลายเธรดมากกว่าที่จำเป็นจริงๆ
ฉันจะเริ่มต้นด้วยการสร้างคลาสด้วยคิวของเธรดและคิวของงาน จากนั้นใช้วิธีการที่เพิ่มงานลงในคิวงานและย้ายจากที่นั่น เห็นได้ชัดว่าคุณควรตั้งค่าจำนวนเธรดที่อนุญาตสูงสุดในเธรดพูลด้วย
ในแอปพลิเคชันแบบมัลติเธรดเธรดพูลคือ "กลุ่มของเธรดที่พร้อมใช้งาน" ที่แอปพลิเคชันของคุณสามารถใช้งานได้ โดยปกติแล้วเช่น. NET จะจัดการทั้งหมดดังนั้นคุณเพียงแค่มอบหมายงานและเมื่อเธรดว่างก็จะดำเนินการ ดังนั้นในการใช้เธรดพูลฉันคาดหวังว่าจะสร้างแนวคิดที่งานจะถูกใช้โดยเธรดอิสระโดยไม่ต้องสร้างเธรดอย่างชัดเจนสำหรับแต่ละงาน
ตัวอย่างชีวิตจริง;
คุณมีสิ่งอำนวยความสะดวกที่นั่นมี 12 คนกำลังทำงานอยู่ สิ่งอำนวยความสะดวกนี้มี 3 ส่วน ห้องครัวห้องน้ำและความปลอดภัย ถ้าคุณไม่ใช้เทคนิคกลุ่มเธรดนั่นคือวิธีการทำงาน: ทั้ง 12 คนจะยืนอยู่ในห้องประชุมหากลูกค้าใหม่มาด้วยสิ่งอำนวยความสะดวกและของานคุณจะแยกคนเป็นกลุ่มและส่งพวกเขาไปทำงาน และกลับมาที่ห้องประชุม แต่ก่อนที่พวกเขาจะไปปฏิบัติหน้าที่มีขั้นตอนการเตรียมการ พวกเขาจำเป็นต้องสวมเครื่องแบบที่ถูกต้องติดตั้งอุปกรณ์บางอย่างและเดินไปที่ส่วนนั้นทำงานให้เสร็จและกลับมา ดังนั้นทุกครั้งที่พวกเขาทำงานเสร็จ (ด้ายจบ) พวกเขาจำเป็นต้องเดินกลับไปที่ห้องประชุมถอดเสื้อผ้าถอดอุปกรณ์ออกและรองานต่อไป สิ่งเหล่านี้อ้างถึงการสร้างเธรดบริบทการจัดสรรหน่วยความจำและข้อมูลการติดตามโดยระบบปฏิบัติการ
หากคุณใช้การรวมเธรดแล้วในตอนเช้าคุณจะกำหนดให้ 6 คนเข้าครัว 2 คนเข้าห้องน้ำ 2 คนและ 4 คนเพื่อความปลอดภัย ดังนั้นพวกเขาจะทำการเตรียมตัวเพียงครั้งเดียวในหนึ่งวัน แม้ว่าจะไม่มีลูกค้าอยู่ในครัวคนทั้ง 4 คนก็จะอยู่เฉยๆสำหรับงานที่กำลังจะเกิดขึ้น พวกเขาไม่จำเป็นต้องกลับไปที่ห้องประชุมจนกว่าครัวจะปิดลง 4 คนนี้อยู่ในแอพ Kitchen และพร้อมที่จะให้บริการอย่างรวดเร็ว แต่คุณไม่สามารถสัญญาว่าพวกเขาจะทำงานได้ตลอดทั้งวันเนื่องจากห้องครัวอาจกลายเป็นเวลาว่าง ใช้ตรรกะเดียวกันสำหรับห้องน้ำและความปลอดภัยเช่นกัน
ในสถานการณ์แรกคุณไม่ต้องเสียเธรดใด ๆ สำหรับงานใด ๆ แต่จะใช้เวลาในการเตรียมเธรดเดี่ยวสำหรับงานแต่ละงาน ในครั้งที่สองคุณเตรียมหัวข้อล่วงหน้าดังนั้นคุณจึงไม่สามารถรับประกันได้ว่าคุณจะใช้เธรดทั้งหมดสำหรับงานทั้งหมด แต่ระบบปฏิบัติการส่วนใหญ่จะทำการปรับให้เหมาะสมอย่างมากเพื่อให้คุณสามารถวางใจได้