直接上實例:
package gaobingfa.test.FutureTaskTest;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class FutureTask_a {
public static void main(String[] args) throws Exception {
//創建線程池
ExecutorService executor = Executors.newCachedThreadPool();
FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println(Thread.currentThread().getName() + ":" + "開始燒開水...");
// 模擬燒開水耗時
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + ":" + "開水已經燒好了...");
return "開水";
}
});
//1線程池提交
executor.submit(futureTask);
//2線程啟動
Thread thread = new Thread(futureTask);
thread.start();
// do other thing
System.out.println(Thread.currentThread().getName() + ":" + " 此時開啟了一個線程執行future的邏輯(燒開水),此時我們可以干點別的事情(比如准備火鍋食材)...");
// 模擬准備火鍋食材耗時
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + ":" + "火鍋食材准備好了");
String shicai = "火鍋食材";
// 開水已經稍好,我們取得燒好的開水
//獲取futureTask執行結果
String boilWater = futureTask.get();
System.out.println(Thread.currentThread().getName() + ":" + boilWater + "和" + shicai + "已經准備好,我們可以開始打火鍋啦");
}
}
FutureTask常用運行callable的方式
1、submit給線程池
2、new線程並且start
提供了三種功能和五種常用方法:
功能:
1)判斷任務是否完成;
2)能夠中斷任務;
3)能夠獲取任務執行結果。
方法:
- cancel方法用來取消任務,如果取消任務成功則返回true,如果取消任務失敗則返回false。參數mayInterruptIfRunning表示是否允許取消正在執行卻沒有執行完畢的任務,如果設置true,則表示可以取消正在執行過程中的任務。如果任務已經完成,則無論mayInterruptIfRunning為true還是false,此方法肯定返回false,即如果取消已經完成的任務會返回false;如果任務正在執行,若mayInterruptIfRunning設置為true,則返回true,若mayInterruptIfRunning設置為false,則返回false;如果任務還沒有執行,則無論mayInterruptIfRunning為true還是false,肯定返回true。
- isCancelled方法表示任務是否被取消成功,如果在任務正常完成前被取消成功,則返回 true。
- isDone方法表示任務是否已經完成,若任務完成,則返回true;
- get()方法用來獲取執行結果,這個方法會產生阻塞,會一直等到任務執行完畢才返回;
- get(long timeout, TimeUnit unit)用來獲取執行結果,如果在指定時間內,還沒獲取到結果,就直接返回null。
以上實例包括線程池提交和新線程運行 菜鳥記錄 僅供參考!