帶你快速搞定java多線程(2)
1、Future的類圖結構,從整體上看下Future的結構
首先看下future接口的函數,共有5個方法。
get() 獲取執行的結果,另外一個重載是有時間限制的get ,如果超時會有異常
isDone() 判斷future 結果是否處理完成
cancel 取消任務
2、future的使用,說的再多都麼什麼用,來個例子悄悄怎麼用的。
package thread; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * @author 香菜 */ public class FutureTest { private ExecutorService bossExecutor = Executors.newSingleThreadExecutor(); public Future<Integer> getHpTask(Integer input) { return bossExecutor.submit(() -> { System.out.println("Calculating..." + input); Thread.sleep(1000); return input * input; }); } public static void main(String[] args) throws ExecutionException, InterruptedException { Future<Integer> calculate = new FutureTest().getHpTask(100); System.out.println(calculate.get()); System.out.println("Done"); } }
3、通俗理解
future 就像是去買手抓餅,你把錢給老板之後,老板對你說我做好瞭之後會放在旁邊的盤子裡,而這個盤子就是future,你用isDone 判斷盤子裡是不是有你要的手抓餅,有的話你就拿走。當然你可以一直在那等著 get(),或者去做其他的事情,等會再來拿。
4、原理
看下
public V get() throws InterruptedException, ExecutionException { int s = state; if (s <= COMPLETING) s = awaitDone(false, 0L); return report(s); } private int awaitDone(boolean timed, long nanos) throws InterruptedException { final long deadline = timed ? System.nanoTime() + nanos : 0L; WaitNode q = null; boolean queued = false; for (;;) { if (Thread.interrupted()) { removeWaiter(q); throw new InterruptedException(); } int s = state; if (s > COMPLETING) { if (q != null) q.thread = null; return s; } else if (s == COMPLETING) // cannot time out yet Thread.yield(); else if (q == null) q = new WaitNode(); else if (!queued) queued = UNSAFE.compareAndSwapObject(this, waitersOffset, q.next = waiters, q); else if (timed) { nanos = deadline - System.nanoTime(); if (nanos <= 0L) { removeWaiter(q); return state; } LockSupport.parkNanos(this, nanos); } else LockSupport.park(this); } }
看下上面的代碼就是在獲取結果的時候,會先判斷狀態是否完成,如果完成瞭就正常返回結果,如果沒完成就會調用awaitDone,看名字也能看出來就是等待直到完成,進入代碼可以看到就是將進入死循環檢查狀態,線程阻塞等待,直到完成。要你寫你是不是也會這樣寫?
5、總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- java ThreadPoolExecutor線程池拒絕策略避坑
- Java中Future和FutureTask的示例詳解及使用
- Java並發編程必備之Future機制
- Java多線程並發FutureTask使用詳解
- 帶你快速搞定java並發庫