Khung thực thi được thiết kế bằng cách sử dụng khái niệm nhóm luồng. Nhóm luồng là cách để sử dụng lại luồng đã được tạo thay vì tạo một luồng mới mỗi lần để thực thi tác vụ hiện tại.
Lớp Executor cung cấp một phương thức factory để tạo các nhóm luồng. Lớp ThreadPoolExecutor là triển khai cơ sở cho các trình thực thi được trả về từ nhiều phương thức của nhà máy Executor.
Sr. Không. | Phím | Nhóm Chủ đề Cố định | Nhóm chủ đề được lưu trong bộ nhớ cache |
---|---|---|---|
1 | Cơ bản | Theo Java Doc - Tạo một nhóm luồng sử dụng lại một số lượng cố định các luồng hoạt động ngoài hàng đợi không bị ràng buộc được chia sẻ. Tại bất kỳ thời điểm nào, hầu hết các luồng nThreads sẽ là các tác vụ xử lý tích cực. Nếu các tác vụ bổ sung được gửi khi tất cả các luồng đang hoạt động, chúng sẽ đợi trong hàng đợi cho đến khi có một luồng. Nếu bất kỳ luồng nào kết thúc do lỗi trong quá trình thực thi trước khi tắt, luồng mới sẽ thế chỗ nếu cần để thực thi các tác vụ tiếp theo. Các chủ đề trong nhóm sẽ tồn tại cho đến khi nó bị tắt một cách rõ ràng. | Theo Java Doc - Tạo một nhóm luồng để tạo các luồng mới nếu cần, nhưng sẽ sử dụng lại các luồng đã xây dựng trước đó khi chúng có sẵn. Các nhóm này thường sẽ cải thiện hiệu suất của các chương trình thực thi nhiều tác vụ không đồng bộ trong thời gian ngắn. Các lệnh gọi để thực thi sẽ sử dụng lại các luồng đã xây dựng trước đó nếu có. Nếu không có luồng hiện tại nào khả dụng, một luồng mới sẽ được tạo và thêm vào nhóm. |
2 | Hàng đợi | Nó sử dụng Hàng đợi Chặn. | Nó sử dụng SynchronousQueue xếp hàng . |
3 | Thời gian tồn tại của chuỗi | Nó sẽ giữ cho tất cả các chuỗi hoạt động cho đến khi chúng bị chấm dứt một cách rõ ràng | Các chuỗi không được sử dụng trong sáu mươi giây sẽ bị kết thúc và bị xóa khỏi bộ nhớ cache |
4. | Kích thước nhóm luồng | Kích thước nhóm luồng được cố định nên nó sẽ không phát triển. | Nhóm luồng có thể phát triển từ 0 luồng thành Integer.MAX_VALUE |
5. | Trường hợp Sử dụng | Chúng ta nên sử dụng fixedthreadpool, khi chúng ta muốn giới hạn tác vụ đồng thời | Nó có thể được sử dụng khi bạn có nhiều nhiệm vụ có thể đoán trước được. |
Ví dụ về nhóm chủ đề cố định
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()); } }