กรอบงานผู้ดำเนินการได้รับการออกแบบโดยใช้แนวคิดกลุ่มเธรด เธรดพูลเป็นวิธีการนำเธรดที่สร้างไว้แล้วกลับมาใช้ใหม่ แทนที่จะสร้างเธรดใหม่ทุกครั้งเพื่อดำเนินการงานปัจจุบัน
คลาสตัวดำเนินการจัดเตรียมวิธีการจากโรงงานเพื่อสร้างพูลเธรด คลาส ThreadPoolExecutor เป็นการใช้งานพื้นฐานสำหรับ executors ที่ส่งคืนจากวิธีการต่างๆ ของ Executors จากโรงงาน
ซีเนียร์ เลขที่ | คีย์ | แก้ไขกลุ่มเธรด | พูลเธรดที่แคช |
---|---|---|---|
1 | พื้นฐาน | ตาม Java Doc − สร้างพูลเธรดที่นำเธรดจำนวนคงที่กลับมาใช้ใหม่โดยดำเนินการจากคิวที่ไม่ จำกัด แบบแบ่งใช้ ณ จุดใด ๆ ที่เธรด nThreads ส่วนใหญ่จะเป็นงานการประมวลผลที่ใช้งานอยู่ หากมีการส่งงานเพิ่มเติมเมื่อเธรดทั้งหมดทำงาน พวกเขาจะรอในคิวจนกว่าเธรดจะพร้อมใช้งาน หากเธรดใดหยุดทำงานเนื่องจากความล้มเหลวระหว่างการดำเนินการก่อนที่จะปิด เธรดใหม่จะเข้ามาแทนที่หากจำเป็นเพื่อดำเนินงานที่ตามมา เธรดในพูลจะมีอยู่จนกว่าจะมีการปิดระบบอย่างชัดแจ้ง | ตาม Java Doc − สร้างเธรดพูลที่สร้างเธรดใหม่ตามต้องการ แต่จะใช้เธรดที่สร้างไว้ก่อนหน้านี้ซ้ำเมื่อพร้อมใช้งาน โดยทั่วไป พูลเหล่านี้จะปรับปรุงประสิทธิภาพของโปรแกรมที่ทำงานแบบอะซิงโครนัสที่มีอายุสั้นจำนวนมาก การโทรเพื่อดำเนินการจะใช้เธรดที่สร้างไว้ก่อนหน้านี้ซ้ำ หากมี หากไม่มีเธรดที่มีอยู่ เธรดใหม่จะถูกสร้างขึ้นและเพิ่มลงในพูล |
2 | คิว | ใช้ Blocking Queue | มันใช้ SynchronousQueue คิว . |
3 | อายุเธรด | มันจะทำให้เธรดทั้งหมดทำงานจนกว่าจะมีการยกเลิกอย่างชัดเจน | กระทู้ที่ไม่ได้ใช้เป็นเวลาหกสิบวินาทีจะถูกยกเลิกและลบออกจากแคช |
4. | ขนาดพูลเธรด | ขนาดของเธรดพูลได้รับการแก้ไขเพื่อไม่ให้ขยาย | เธรดพูลสามารถขยายจากศูนย์เธรดเป็น Integer.MAX_VALUE |
5. | ใช้ตัวพิมพ์ | เราควรใช้ fixedthreadpool เมื่อเราต้องการจำกัดงานที่เกิดขึ้นพร้อมกัน | สามารถใช้ได้เมื่อคุณมีงานที่คาดเดาได้มากมาย |
ตัวอย่างกลุ่มเธรดคงที่
public class Main { public static void main(String args[]) throws InterruptedException { ExecutorService executors = Executors.newFixedThreadPool(4); CountDownLatch latch= new CountDownLatch(2); executors.submit(new Service1(latch)); executors.submit(new Service2(latch)); latch.await(); System.out.println("Done"); } import java.util.concurrent.CountDownLatch; public class Service1 implements Runnable { CountDownLatch latch; public Service1(CountDownLatch latch) { super(); this.latch = latch; } @Override public void run() { try { Thread.sleep(20000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } latch.countDown(); System.out.println("Services2"+latch.getCount()); } } import java.util.concurrent.CountDownLatch; public class Service2 implements Runnable { CountDownLatch latch; public Service2(CountDownLatch latch) { super(); this.latch = latch; } @Override public void run() { try { Thread.sleep(20000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } latch.countDown(); System.out.println("Services2"+latch.getCount()); } }