并發模式中,有一個稱做Future模式。啥是Future模式捏? future,翻譯成中文就是“未來,將來”的意思,可以簡單地理解為 “明天的事明天再做” 。
比方說,你在做晚飯,而只有一個火爐,先燉個豬蹄要1小時,在等待豬蹄的這個時間里,你可以去淘米、洗菜、刷牙、摳腳,待豬蹄燉好了,再繼續炒菜。
在編碼中體現為:將耗時任務丟入單獨的線程,從而使主線程能夠繼續執行其它的邏輯,待耗時任務執行完成后再做相應的處理。
Future模式是一鐘十分常用的并發模式,所以JDK的并發包中自帶一套實現。上類圖:
這個自己畫的,既然畫了不能白畫,囧!!!
下面這個是用
IntelliJ IDEA 自帶工具生成的,真心太酸爽。
只看函數名稱,也能基本了解FutureTask所提供的主要能力:
1、可判斷執行狀態(isDone())
2、可取消(cancel())
3、可讀取返回結果(get())
4、可判斷是否取消(isCancelled)
現在,我們可以解決上面這個豬腳的問題了:
public static class TestTask implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
//模擬時間消耗
System.out.println("--------漫長的一小時--------");
Thread.sleep(10000);
System.out.println("--------豬腳燉完--------");
return true;
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("--------開始做晚飯--------");
System.out.println("開始燉豬腳~~~");
System.out.println("--------豬腳下鍋--------");
FutureTask<Boolean> futureTask = new FutureTask<Boolean>(new TestTask());
Thread thread = new Thread(futureTask);
thread.start();
Thread.sleep(1000);
System.out.println("--------淘米--------");
Thread.sleep(1000);
System.out.println("--------洗菜--------");
Thread.sleep(1000);
System.out.println("--------刷牙--------");
Thread.sleep(1000);
System.out.println("--------摳腳--------");
//如果豬腳燉好了
if(futureTask.get()==true){
System.out.println("--------繼續炒菜--------");
}
}
執行結果:
--------開始做晚飯--------
開始燉豬腳~~~
--------豬腳下鍋--------
--------漫長的一小時--------
--------淘米--------
--------洗菜--------
--------刷牙--------
--------摳腳--------
--------豬腳燉完--------
--------繼續炒菜--------
posted on 2014-10-23 16:13
Jimi 閱讀(5268)
評論(3) 編輯 收藏