Một loại nhóm nhiệm vụ khác là nhóm nhiệm vụ theo lịch trình. Đánh giá theo tên, chúng tôi có thể giả định rằng chúng tôi sử dụng loại này để lên lịch khi một tác vụ cụ thể sẽ được khởi chạy.
Loại dịch vụ này hữu ích khi chúng tôi có nhiệm vụ khởi chạy một hoạt động sau một thời gian đã trôi qua hoặc chúng tôi muốn lên lịch cho một nhiệm vụ định kỳ.
Để sử dụng một, chúng tôi gọi Executors.newScheduledThreadPool(1) .
Chúng ta sẽ nói về các tham số một lát sau. Nhưng bây giờ, điều chúng ta cần biết là khi phương thức này được gọi, chúng ta sẽ nhận được một đối tượng ScheduledExecutorService .
ScheduledExecutorService là một giao diện mở rộng ExecutorService .
Các phương thức sau xuất hiện trong giao diện này:
Phương pháp | Giải trình |
---|---|
|
Tạo và thực thi hành động một lần chạy sau độ trễ đã chỉ định. |
|
Tạo và thực hiện mộtDự kiếnTương laiđối tượng thực thi sau một độ trễ xác định. |
|
Tạo và thực hiện một hành động định kỳ chạy đầu tiên sau độ trễ ban đầu đã chỉ định và sau đó chạy lại sau khoảng thời gian đã chỉ định. Nói cách khác, quá trình thực thi sẽ bắt đầu sau initDelay , rồi initDelay + period , sau đó initDelay + 2 * period , v.v. |
|
Tạo và thực thi một hành động định kỳ thực hiện trước sau độ trễ ban đầu đã chỉ định, sau đó thực hiện lại với độ trễ đã chỉ định giữa khi hoàn thành một lần thực hiện và bắt đầu lần thực hiện tiếp theo. |
Vì vậy, giao diện cho phép chúng tôi chạy các tác vụ đều đặn hoặc sau một thời gian trễ.
Tìm hiểu thêm về phương pháp newScheduledThreadPool.
Chúng ta có thể gọi nó theo nhiều cách:
|
corePoolSize là số luồng cần giữ trong nhóm, ngay cả khi chúng không hoạt động. |
|
corePoolSize là số luồng cần giữ trong nhóm, ngay cả khi chúng không hoạt động. threadFactory là nhà máy để sử dụng khi tạo chủ đề mới. |
Cả hai phương pháp sẽ tạo một nhóm luồng có thể lên lịch các hành động để thực thi sau một khoảng thời gian trễ được chỉ định hoặc theo định kỳ.
Hãy xem một ví dụ để xem cách hoạt động của ScheduledThreadPool .
Ví dụ: giả sử chúng tôi có nhiệm vụ kiểm tra email cứ sau 5 giây, nhưng việc kiểm tra này không được ảnh hưởng đến chương trình chính và kéo theo khả năng tiêu thụ tài nguyên bổ sung.
Chúng tôi có một lớp nhiệm vụ mô phỏng việc kiểm tra email.
public class Task implements Runnable {
@Override
public void run() {
System.out.println("Checking email...");
}
}
Tiếp theo, chúng tôi tạo một nhóm luồng và lên lịch kiểm tra.
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new Task(), 0, 5, TimeUnit.SECONDS);
Ở đầu ra, cứ sau 5 giây chúng ta lại thấy:
Nói chung, chúng ta có thể sử dụng một nhóm như vậy để thực hiện các nhiệm vụ "dọn phòng" định kỳ, như trong ví dụ. Nhiệm vụ vệ sinh là nhiệm vụ phải được thực hiện bất kể chương trình chính đang làm gì.