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

12
การจัดการข้อยกเว้นจากงาน Java ExecutorService
ฉันกำลังพยายามใช้ThreadPoolExecutorคลาสของ Java เพื่อทำงานหนักจำนวนมากด้วยจำนวนเธรดที่แน่นอน แต่ละงานมีหลายสถานที่ซึ่งอาจล้มเหลวเนื่องจากข้อยกเว้น ฉันได้ subclassed ThreadPoolExecutorและฉันได้แทนที่afterExecuteวิธีที่ควรจะให้ข้อยกเว้นที่ไม่ถูกตรวจพบในขณะที่ทำงาน อย่างไรก็ตามฉันไม่สามารถใช้งานได้ ตัวอย่างเช่น: public class ThreadPoolErrors extends ThreadPoolExecutor { public ThreadPoolErrors() { super( 1, // core threads 1, // max threads 1, // timeout TimeUnit.MINUTES, // timeout units new LinkedBlockingQueue<Runnable>() // work queue ); } protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); …


13
เป็นไปไม่ได้ที่จะสร้างพูลเธรดแบบแคชที่มีขนาด จำกัด ?
ดูเหมือนว่าจะเป็นไปไม่ได้ที่จะสร้างพูลเธรดที่แคชโดย จำกัด จำนวนเธรดที่สามารถสร้างได้ นี่คือวิธีการใช้งาน Executors.newCachedThreadPool แบบคงที่ในไลบรารี Java มาตรฐาน: public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } ดังนั้นการใช้เทมเพลตนั้นเพื่อสร้างพูลเธรดที่แคชขนาดคงที่: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>()); ตอนนี้ถ้าคุณใช้สิ่งนี้และส่งงาน 3 อย่างทุกอย่างจะเรียบร้อย การส่งงานเพิ่มเติมใด ๆ จะทำให้ถูกปฏิเสธข้อยกเว้นในการดำเนินการ ลองทำสิ่งนี้: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>()); จะส่งผลให้เธรดทั้งหมดดำเนินการตามลำดับ กล่าวคือเธรดพูลจะไม่สร้างเธรดมากกว่าหนึ่งเธรดเพื่อจัดการงานของคุณ นี่คือบั๊กในวิธีการรันของ ThreadPoolExecutor? หรืออาจจะเป็นความตั้งใจ? หรือมีวิธีอื่นบ้าง? …

10
ขนาดคอร์พูลเทียบกับขนาดพูลสูงสุดใน ThreadPoolExecutor
อะไรคือความแตกต่างระหว่างขนาดของคอร์พูลและขนาดพูลสูงสุดเมื่อเราพูดถึงThreadPoolExecutor? สามารถอธิบายได้ด้วยความช่วยเหลือของตัวอย่างหรือไม่?

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.