一、問題
1.1、環境
電腦環境:Windows 10;
開發工具:IntelliJ IDEA;
數據庫環境:Redis 3.2.100
JDK環境: Jdk1.8;
1.2、問題
Future,是異步線程調用的返回值容器接口,可以封裝自己想反悔的實體類;一般你再main方法裏寫了一個異步調用的線程任務,表面上,它會很快就執行完了,實際上,後臺任然在執行;就好比:你在樓下玩耍,你媽在樓上讓你回家喫飯,你媽喊一嗓子,你聽到了,喊你喫飯的任務就完成了;但是實際上,等你往回走,爬樓梯,開家門,洗手,喫飯,還有一段時間需要執行這些步驟;等你到家後,你才能喫到飯;Future接口容器裏封裝這你,你媽看到你回家了,纔會開飯;
二、解答
刪除了註解後的源碼源碼
package java.util.concurrent;
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
2.1綜述:
Function代表異步調用的計算結果;方法被提供出來去檢查是否計算已經完成;爲了等待他的計算,並且找回計算結果;
①get()方法:任務執行時會被阻塞,只有當異步計算完成後,這個計算結果可以並且只能通過get方法找回;
②cancel()方法:通過cancel方法消除;
③額外的方法被提供來確定,是否任務正常完成或者被取消了;一旦計算完成,就不能被取消了;
④如果你希望使用Future來使任務可取消,但是沒有提供有用的結果;你可以定義Futrue的形式並且返回null作爲底層任務的結果;
2.2分述
1.cancel()方法
- 嘗試關閉任務的執行.當任務已經完成,已經被取消或者因爲某些原因不能夠取消,這個方法將會失敗;
- 如果任務還沒啓動,當Future.cancel()方法被調用,那麼這個任務將永遠不會被啓動了;
- 如果任務已經啓動,那麼mayInterruptInRunning 參數決定終止任務的企圖 是否 能 執行任務的線程中斷命令;
- 當cancel()方法返回true時,隨後的調用isDone()方法將永遠返回true;
- 會後再調用isCancelled()方法將永遠返回true;
- 如果線程執行這個任務應該被終止掉,mayInterruptIfRunning 值應該是true;否則進程中的任務會被完成;(而不是終止);
- 如果返回false,則任務不能夠被終止,很可能的原因是:它已經被正常完成了;
2.isCancelled()方法
是否被取消了:如果任務在完成之前被cancel()了,則返回true,否則返回false;
3.isDone()方法
是否任務已經被完成;
4.get()方法
等待異步線程結束,然後返回值結果;如果任務被取消了,會報CancellationException異常;如果當前線程被中斷會報InterruptedException異常;
5.get(long timeout,TimeUnit unit)
給定超時時間,並返回結果;timeout是最大等待時間;
unit是時間的單位,可以是秒,也可以是毫秒等;方法會返回線程的結果;因爲前面有可取消方法,所以這裏也可能會拋CancellationException異常,因爲任何線程都可能被終止,所以它也會拋出InterruptedException異常;另外,加了超時時間,所以它還會拋出TimeoutException異常;
完畢~
三、總結
歡迎關注我的
CSDN博客: https://blog.csdn.net/River_Continent
微信公衆號:幕橋社區
知乎:張牧野, https://www.zhihu.com/people/zhang-mu-ye-37-76/activities
簡書: https://www.jianshu.com/u/02c0096cbfd3