【Java】異步線程的返回封裝接口Function

一、問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章