คำถามติดแท็ก blockingqueue

9
จะทำให้ ThreadPoolExecutor เพิ่มเธรดให้สูงสุดก่อนเข้าคิวได้อย่างไร
ฉันรู้สึกท้อแท้มาระยะหนึ่งแล้วกับพฤติกรรมเริ่มต้นThreadPoolExecutorซึ่งอยู่เบื้องหลังExecutorServiceเธรดพูลที่พวกเราหลายคนใช้ หากต้องการอ้างอิงจาก Javadocs: หากมีมากกว่า corePoolSize แต่น้อยกว่าหัวข้อ maximumPoolSize ทำงานหัวข้อใหม่จะถูกสร้างขึ้นเฉพาะในกรณีที่คิวเต็ม สิ่งนี้หมายความว่าถ้าคุณกำหนดเธรดพูลด้วยรหัสต่อไปนี้เธรดจะไม่เริ่มเธรดที่ 2 เนื่องจากLinkedBlockingQueueไม่ถูกผูกไว้ ExecutorService threadPool = new ThreadPoolExecutor(1 /*core*/, 50 /*max*/, 60 /*timeout*/, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(/* unlimited queue */)); เฉพาะในกรณีที่คุณมีคิวที่ถูกล้อมรอบและคิวเต็มเท่านั้นที่จะมีเธรดที่อยู่เหนือหมายเลขหลักเริ่มต้น ฉันสงสัยว่าโปรแกรมเมอร์มัลติเธรด Java รุ่นจูเนียร์จำนวนมากไม่ทราบถึงพฤติกรรมนี้ของไฟล์ThreadPoolExecutor. ตอนนี้ฉันมีกรณีการใช้งานที่เฉพาะเจาะจงซึ่งไม่เหมาะสม ฉันกำลังมองหาวิธีต่างๆโดยไม่ต้องเขียนคลาส TPE ของตัวเองเพื่อแก้ไข ข้อกำหนดของฉันมีไว้สำหรับบริการเว็บที่โทรกลับไปยังบุคคลที่สามที่อาจไม่น่าเชื่อถือ ฉันไม่ต้องการโทรกลับพร้อมกันกับคำขอทางเว็บดังนั้นฉันต้องการใช้เธรดพูล ฉันมักจะได้เวลาสองสามนาทีนี้ดังนั้นฉันจึงไม่อยากมีnewFixedThreadPool(...)เธรดจำนวนมากที่ส่วนใหญ่อยู่เฉยๆ บ่อยครั้งที่ฉันได้รับปริมาณการใช้งานจำนวนมากและฉันต้องการเพิ่มจำนวนเธรดให้เป็นค่าสูงสุด (สมมติว่า 50) ฉันต้องพยายามอย่างเต็มที่เพื่อทำการโทรกลับทั้งหมดดังนั้นฉันจึงต้องการจัดคิวรายการเพิ่มเติมที่สูงกว่า 50 ฉันไม่ต้องการทำให้เว็บเซิร์ฟเวอร์ส่วนที่เหลือของฉันล้นโดยใช้ไฟล์newCachedThreadPool(). ฉันจะแก้ไขข้อ จำกัด นี้ได้อย่างไรในThreadPoolExecutorกรณีที่คิวต้องถูกล้อมรอบและเต็มก่อนที่จะเริ่มเธรดเพิ่มเติม ฉันจะเริ่มเธรดเพิ่มเติมก่อนเข้าคิวงานได้อย่างไร แก้ไข: @Flavio …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.