(一)、FutureTask概述
- FutureTask的應用場景主要是一個線程需要等待另一個線程的時候可以使用,FutureTask的get()方法會使當前線程阻塞,直到目標線程完成任務返回結果,纔會繼續往下執行。
- FutureTask最大的特點就是支持取消任務。
- FutureTask的run()方法主要有以下三種狀態:
狀態 | 具體描述 |
---|---|
未啓動狀態 | 在FutureTask.run()方法執行之前,處於未啓動狀態 |
已啓動狀態 | FutureTask.run()方法已經執行了,但是任務還未執行完 |
已完成狀態 | run()方法已經執行完成 |
4. 針對上面的三種狀態,FutureTask.cancel()方法也對應有三種取消時間
取消時的狀態 | 具體描述 |
---|---|
未啓動狀態 | 執行FutureTask.cancel()方法將此任務永遠不會執行 |
已啓動狀態 | 執行FutureTask.cancel(true)方法將以中斷線程的方式來阻止任務繼續進行,如果執行FutureTask.cancel(false)將不會對正在執行任務的線程有任何影響; |
已完成狀態 | 執行FutureTask.cancel(…)方法將返回false |
(二)、FutureTask具體應用
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(100);
System.out.println("第" + i +"次運行結束");
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
FutureTask futureTask = new FutureTask(runnable,"gogo");
new Thread(futureTask).start();
try {
futureTask.get();
System.out.println("程序執行完畢");
} catch (Exception e) {
}
}
可以看到主線程會等待副線程全部執行完畢才返回結果。