Java: Giao diện (interface) Executor
Trong những ví dụ của các bài viết trên, có một kết nối đóng giữa tác vụ được thực thi bởi một luồng mới được định nghĩa bởi đối tượng Runnable của nó
, và bản thân luồng đó được định nghĩa bởi đối tượng Thread
. Những công việc này rất phù với đối với những ứng dụng nhỏ, nhưng với những ứng dụng có tầm cỡ thì nó dẫn dẫn sự phân tách giữa việc quán lý luồng và việc tạo phần còn lại của ứng dụng. Các đối tượng đóng gói những chức năng này được gọi là bộ thực thi. Dưới đây là những mô tả chi tiết cho bộ thực thi.
Giao diện Executor
Gói java.util.concurrent
định nghĩa ba giao diện bộ thực thi như sau:
- Executor, một giao diện đơn giản để hỗ trợ khởi tạo tác vụ mới.
ExecutorService
, giao diện có của Executor có thêm tính năng giúp quản lý vòng đời, bao gồm các tác vụ cá nhân và bộ thực thi của chính nó.ScheduledExecutorService
, một giao diện con củaExecutorService
, hỗ trợ trong tương lai và/hoặc thực hiện định kỳ các tác vụ.
Thông thường, các biến tham chiếu đến đối tượng Executor được khai báo là một trong ba loại giao diện trên mà không phải với kiểu lớp thực thi.
Executor
Giao diện (interface) Executor
cung cấp một phương thức duy nhất là execute() được thiết kế để thay thế cho việc tạo luồng. Nếu r
là một đối tượng Runnable
và e
là một đối tượng Executor thì
bạn có thể thay thế
bằng
Tuy nhiên, sự định nghĩa của phương thức execute() không có tính cụ thể cao. Các thành ngữ cấp thấp tạo ra một luồng mới và khởi chạy nó ngay lập tức. Tùy thuộc vào sự thực thi Executor, phương thức execute() có thể làm điều tương tự, nhưng có nhiều khả năng sử dụng một luồng worker để chạy r
, hoặc đặt r
trong một hàng đợi để chờ cho một luồng worker.
Bộ thực thi sẽ thi hành trong gói java.util.concurrent
được thiết kế để sử dụng đầy đủ các giao diện tiên tiến hơn là ExecutorService
và ScheduledExecutorService
, mặc dù chúng cũng làm việc với các giao diện cơ sở Executor
.
Giao diện ExecutorService
Giao diện ExecutorService
bổ sung phương thức execute() cũng khá tương tự, nhưng linh hoạt hơn phương thức submit(). Cũng giống như execute(), phương thức submit() chấp nhận đối tượng Runnable
, nhưng nó cũng chấp nhận đối tượng Callable
, trong đó cho phép trả lại một giá trị. Phương thức submit() trả về đối tượng Future, được sử dụng để lấy giá trị trả về là Callable
để quản lý tình trạng của cả hai tác vụ Callable
và Runnable
.
ExecutorService
cũng cung cấp phương thức để gửi được nhiều đối tượng Callable
. Cuối cùng ExecutorService
cung cấp một số phương thức để quản lý việc tắt bộ thực thi. Để hỗ trợ việc tắt tức thì thì các tác vụ này cần xử lý ngắt một cách chính xác.
Giao diện ScheduledExecutorService
Giao diện ScheduledExecutorService
bổ sung các phương thức của cha của nó ExecutorService
là schedule(), phương thức này thực hiện một tác vụ Runnable
hoặc Callable
sau mỗi độ trễ nhất định. Ngoài ra, nó cũng định nghĩa scheduleAtFixedRate
và scheduleWithFixedDelay
, dùng để thực hiện các nhiệm vụ lặp lại nhiều lần, trong khoảng thời gian xác định.