người thi hành

Executor là giao diện cơ sở cho các lớp thực hiện khởi chạy các tác vụ Runnable . Điều này cung cấp hỗ trợ với việc thêm một nhiệm vụ và cách bắt đầu nó.

ExecutorService là một giao diện mở rộng các thuộc tính của Executor và mô tả một dịch vụ để chạy các tác vụ Có thể chạy hoặc Có thể gọi được . Các phương thức gửi chấp nhận một tác vụ ở dạng Có thể gọi hoặc Có thể chạy được làm đầu vào và Tương lai được sử dụng làm giá trị trả về, qua đó bạn có thể nhận được kết quả.

Phương thức invokeAll chịu trách nhiệm thực thi các tác vụ, trả về danh sách các tác vụ cùng với trạng thái và kết quả hoàn thành của chúng.

Phương thức invokeAny chịu trách nhiệm thực thi các tác vụ, trả về kết quả của một tác vụ đã hoàn thành thành công (nghĩa là không ném ngoại lệ), nếu có.

ScheduledExecutorService - giao diện này thêm khả năng chạy các tác vụ đang chờ xử lý với một độ trễ nhất định hoặc một khoảng thời gian nhất định.

AbstractExecutorService là một lớp trừu tượng để xây dựng một ExecutorService 'a. Bên trong có một triển khai của các phương thức submit , invokeAll , invokeAny . Lớp này kế thừa ThreadPoolExecutor , ScheduledThreadPoolExecutor ForkJoinPool .

public static void main(String[] args) {
   ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
   Callable<String> task = () -> {
       System.out.println(Thread.currentThread().getName());
       return Thread.currentThread().getName();
   };
   scheduledExecutorService.schedule(task, 10, TimeUnit.SECONDS);
   scheduledExecutorService.shutdown();
}

ThreadPoolExecutor

Executor là lớp gốc để tạo ThreadPoolExecutor , ScheduledThreadPoolExecutor . Nếu bạn cần tạo một trong những nhóm này, thì nhà máy này chính là thứ bạn cần. Nó chứa các bộ điều hợp khác nhau Runnable-Callable, PrivilegedAction-Callable, PrivilegedExceptionAction-Callable và các bộ điều hợp khác. Có các phương thức tĩnh để tạo các ThreadPool khác nhau .

ThreadPoolExecutor - Triển khai các giao diện Executor ExecutorService và tách việc tạo tác vụ khỏi thực thi tác vụ. Chúng ta cần triển khai các đối tượng Runnable và gửi chúng đến bộ thực thi và ThreadPoolExecutor chịu trách nhiệm thực thi, khởi tạo và làm việc với các luồng.

ScheduledThreadPoolExecutor - Ngoài các phương thức ThreadPoolExecutor , nó tạo ra một nhóm các luồng có thể lên lịch các lệnh để thực thi sau một độ trễ nhất định hoặc để thực hiện định kỳ.

chủ đềFactorylà một đối tượng tạo chủ đề mới theo yêu cầu. Chúng ta cần truyền một thể hiện cho phương thức Executors.newSingleThreadExecutor(ThreadFactory threadFactory) .

ExecutorService executorService = Executors.newSingleThreadExecutor(new ThreadFactory() {
 @Override public Thread newThread(Runnable r) {
Thread thread = new Thread(r, "MyThread");
thread.setPriority(Thread.MAX_PRIORITY);
 return thread; }
 });

RejectedExecutionHandler - cho phép bạn xác định một trình xử lý cho các tác vụ mà vì lý do nào đó không thể thực thi được thông qua ThreadPoolExecutor . Điều này xảy ra khi không có luồng miễn phí hoặc dịch vụ bị tắt hoặc tắt.

Một số triển khai tiêu chuẩn được tìm thấy trong lớp ThreadPoolExecutor :

  • CallerRunsPolicy - chạy một tác vụ trên chuỗi cuộc gọi;
  • AbortPolicy - đưa ra một ngoại lệ;
  • DiscardPolicy - bỏ qua tác vụ;
  • DiscardOldestPolicy - Xóa tác vụ chưa bắt đầu cũ nhất khỏi hàng đợi, sau đó thử thêm lại tác vụ mới.

Dịch Vụ Hoàn Công

CompleteionService là một giao diện dịch vụ với việc tách rời khởi chạy các tác vụ không đồng bộ và nhận kết quả. Để thêm các tác vụ, có một phương thứcgửivà để nhận kết quả của các tác vụ đã hoàn thành, một phương thức lấy chặnthăm dòkhông chặn.

ExecutorCompletionService là một trình bao bọc trên bất kỳ lớp nào triển khai giao diện Executor , chẳng hạn như ThreadPoolExecutor hoặc ForkJoinPool . Nó được sử dụng khi cần trừu tượng hóa phương thức khởi chạy các tác vụ và kiểm soát việc thực hiện chúng.

Nếu có những nhiệm vụ đã hoàn thành, thì chúng tôi sẽ rút chúng ra. Nếu không có nhiệm vụ nào, thì chúng tôi sẽ tạm dừng cho đến khi hoàn thành một việc gì đó. Dịch vụ sử dụng LinkedBlockingQueue làm cốt lõi, nhưng bạn có thể chuyển qua bất kỳ triển khai BlockingQueue nào.