在Java中,要取消一個FutureTask
任務,你需要調用Future.cancel()
方法。這個方法接受一個布爾參數mayInterruptIfRunning
,用于指示是否允許中斷正在運行的任務。
以下是一個簡單的示例,展示了如何使用FutureTask
和cancel()
方法取消任務:
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
// 創建一個Callable任務
Callable<String> task = () -> {
Thread.sleep(5000); // 模擬一個耗時任務
return "Task completed";
};
// 將Callable任務包裝成FutureTask
FutureTask<String> futureTask = new FutureTask<>(task);
// 提交FutureTask到線程池
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(futureTask);
try {
// 等待一段時間后取消任務
Thread.sleep(2000);
boolean isCancelled = futureTask.cancel(true); // 設置mayInterruptIfRunning為true以允許中斷
if (isCancelled) {
System.out.println("Task cancelled.");
} else {
System.out.println("Task not cancelled.");
}
} catch (InterruptedException e) {
System.out.println("Main thread interrupted.");
} finally {
// 關閉線程池
executorService.shutdown();
}
}
}
在這個示例中,我們創建了一個Callable
任務,然后將其包裝成FutureTask
。接著,我們將FutureTask
提交給一個線程池。在等待了2秒后,我們調用futureTask.cancel(true)
來取消任務。如果任務被取消,isCancelled
將為true
,否則為false
。最后,我們關閉線程池。
需要注意的是,如果任務已經開始執行(即running
狀態),那么cancel()
方法會嘗試中斷任務。如果任務已經完成、已經取消或者由于其他原因而無法中斷,那么cancel()
方法將返回false
。