ดูเหมือนว่าจะเป็นไปไม่ได้ที่จะสร้างพูลเธรดที่แคชโดย จำกัด จำนวนเธรดที่สามารถสร้างได้
นี่คือวิธีการใช้งาน 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? หรืออาจจะเป็นความตั้งใจ? หรือมีวิธีอื่นบ้าง?
แก้ไข: ฉันต้องการบางสิ่งที่เหมือนกับพูลเธรดที่แคชไว้ (มันสร้างเธรดตามความต้องการแล้วฆ่าพวกมันหลังจากหมดเวลา) แต่มีข้อ จำกัด เกี่ยวกับจำนวนเธรดที่สามารถสร้างได้และความสามารถในการจัดคิวงานเพิ่มเติมต่อเมื่อมี ถึงขีด จำกัด เธรด ตามการตอบสนองของ sjlee สิ่งนี้เป็นไปไม่ได้ ดูที่เมธอด execute () ของ ThreadPoolExecutor นั้นเป็นไปไม่ได้เลย ฉันจะต้อง subclass ThreadPoolExecutor และแทนที่ execute () เหมือนกับที่ SwingWorker ทำ แต่สิ่งที่ SwingWorker ทำใน execute () นั้นเป็นการแฮ็คที่สมบูรณ์