Giao diện ExecutorService
Giao diện java.util.concurrent.ExecutorService là giao diện con của giao diện Executor và thêm các tính năng để quản lý vòng đời, cả các tác vụ riêng lẻ và của chính trình thực thi.
Phương thức ExecutorService
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | boolean awaitTermination(long timeout, TimeUnit unit) Chặn cho đến khi tất cả các tác vụ đã hoàn thành thực thi sau khi yêu cầu tắt máy hoặc hết thời gian chờ xảy ra hoặc luồng hiện tại bị gián đoạn, tùy điều kiện nào xảy ra trước. |
2 | <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) Thực hiện các nhiệm vụ đã cho, trả về danh sách các Hợp đồng tương lai giữ trạng thái và kết quả của họ khi tất cả hoàn thành. |
3 | <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) Thực thi các nhiệm vụ đã cho, trả về danh sách các Hợp đồng tương lai giữ trạng thái và kết quả của chúng khi tất cả hoàn thành hoặc hết thời gian chờ, tùy điều kiện nào xảy ra trước. |
4 | <T> T invokeAny(Collection<? extends Callable<T>> tasks) Thực hiện các nhiệm vụ đã cho, trả về kết quả của một nhiệm vụ đã hoàn thành thành công (tức là không đưa ra ngoại lệ), nếu có. |
5 | <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) Thực thi các tác vụ đã cho, trả về kết quả của một tác vụ đã hoàn thành thành công (tức là không đưa ra ngoại lệ), nếu có trước khi hết thời gian chờ đã cho. |
6 | boolean isShutdown() Trả về true nếu trình thực thi này đã bị tắt. |
7 | boolean isTerminated() Trả về true nếu tất cả các tác vụ đã hoàn thành sau khi tắt. |
số 8 | void shutdown() Bắt đầu tắt theo thứ tự trong đó các nhiệm vụ đã gửi trước đó được thực thi, nhưng không có nhiệm vụ mới nào được chấp nhận. |
9 | List<Runnable> shutdownNow() Cố gắng dừng tất cả các tác vụ đang thực thi, tạm dừng xử lý các tác vụ đang chờ và trả về danh sách các tác vụ đang chờ thực thi. |
10 | <T> Future<T> submit(Callable<T> task) Gửi một nhiệm vụ trả về giá trị để thực hiện và trả về Tương lai đại diện cho các kết quả đang chờ xử lý của nhiệm vụ. |
11 | Future<?> submit(Runnable task) Gửi một tác vụ Runnable để thực thi và trả về Tương lai đại diện cho tác vụ đó. |
12 | <T> Future<T> submit(Runnable task, T result) Gửi một tác vụ Runnable để thực thi và trả về Tương lai đại diện cho tác vụ đó. |
Thí dụ
Chương trình TestThread sau đây cho thấy cách sử dụng giao diện ExecutorService trong môi trường dựa trên luồng.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class TestThread {
public static void main(final String[] arguments) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
try {
executor.submit(new Task());
System.out.println("Shutdown executor");
executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
System.err.println("tasks interrupted");
} finally {
if (!executor.isTerminated()) {
System.err.println("cancel non-finished tasks");
}
executor.shutdownNow();
System.out.println("shutdown finished");
}
}
static class Task implements Runnable {
public void run() {
try {
Long duration = (long) (Math.random() * 20);
System.out.println("Running Task!");
TimeUnit.SECONDS.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Điều này sẽ tạo ra kết quả sau.
Đầu ra
Shutdown executor
Running Task!
shutdown finished
cancel non-finished tasks
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:302)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:328)
at TestThread$Task.run(TestThread.java:39)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)