欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程中的Future類詳細解讀

 更新時間:2023年11月22日 08:48:16   作者:波波仔86  
這篇文章主要介紹了Java多線程中的Future類詳細解讀,Future表示一個可能還沒有完成的異步任務的結果,針對這個結果可以添加Callback以便在任務執(zhí)行成功或失敗后作出相應的操作,需要的朋友可以參考下

1. Future的應用場景

在并發(fā)編程中,我們經常用到非阻塞的模型,在之前的多線程的三種實現(xiàn)中,不管是繼承thread類還是實現(xiàn)runnable接口,都無法保證獲取到之前的執(zhí)行結果。通過實現(xiàn)Callback接口,并用Future可以來接收多線程的執(zhí)行結果。

Future表示一個可能還沒有完成的異步任務的結果,針對這個結果可以添加Callback以便在任務執(zhí)行成功或失敗后作出相應的操作。

舉個例子:比如去吃早點時,點了包子和涼菜,包子需要等3分鐘,涼菜只需1分鐘,如果是串行的一個執(zhí)行,在吃上早點的時候需要等待4分鐘,但是因為你在等包子的時候,可以同時準備涼菜,所以在準備涼菜的過程中,可以同時準備包子,這樣只需要等待3分鐘。那Future這種模式就是后面這種執(zhí)行模式。

2. Future的類圖結構

Future接口定義了主要的5個接口方法,有RunnableFuture和SchedualFuture繼承這個接口,以及CompleteFuture和ForkJoinTask繼承這個接口。

RunnableFuture

這個接口同時繼承Future接口和Runnable接口,在成功執(zhí)行run()方法后,可以通過Future訪問執(zhí)行結果。這個接口都實現(xiàn)類是FutureTask,一個可取消的異步計算,這個類提供了Future的基本實現(xiàn),后面我們的demo也是用這個類實現(xiàn),它實現(xiàn)了啟動和取消一個計算,查詢這個計算是否已完成,恢復計算結果。計算的結果只能在計算已經完成的情況下恢復。如果計算沒有完成,get方法會阻塞,一旦計算完成,這個計算將不能被重啟和取消,除非調用runAndReset方法。

FutureTask能用來包裝一個Callable或Runnable對象,因為它實現(xiàn)了Runnable接口,而且它能被傳遞到Executor進行執(zhí)行。為了提供單例類,這個類在創(chuàng)建自定義的工作類時提供了protected構造函數。

SchedualFuture

這個接口表示一個延時的行為可以被取消。通常一個安排好的future是定時任務SchedualedExecutorService的結果

CompleteFuture

一個Future類是顯示的完成,而且能被用作一個完成等級,通過它的完成觸發(fā)支持的依賴函數和行為。當兩個或多個線程要執(zhí)行完成或取消操作時,只有一個能夠成功。

ForkJoinTask

基于任務的抽象類,可以通過ForkJoinPool來執(zhí)行。一個ForkJoinTask是類似于線程實體,但是相對于線程實體是輕量級的。大量的任務和子任務會被ForkJoinPool池中的真實線程掛起來,以某些使用限制為代價。

3. Future的主要方法

Future接口主要包括5個方法

get()方法可以當任務結束后返回一個結果,如果調用時,工作還沒有結束,則會阻塞線程,直到任務執(zhí)行完畢

get(long timeout,TimeUnit unit)做多等待timeout的時間就會返回結果

cancel(boolean mayInterruptIfRunning)方法可以用來停止一個任務,如果任務可以停止(通過mayInterruptIfRunning來進行判斷),則可以返回true,如果任務已經完成或者已經停止,或者這個任務無法停止,則會返回false.

isDone()方法判斷當前方法是否完成

isCancel()方法判斷當前方法是否取消

4. Future示例demo

需求場景:等早餐過程中,包子需要3秒,涼菜需要1秒,普通的多線程需要四秒才能完成。先等涼菜,再等包子,因為等涼菜時,普通多線程啟動start()方法,執(zhí)行run()中具體方法時,沒有返回結果,所以如果要等有返回結果,必須是要1秒結束后才知道結果。

普通多線程:

public class BumThread extends Thread{
	
	@Override
	public void run() {
		try {
			Thread.sleep(1000*3);
			System.out.println("包子準備完畢");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
 
}
public class ColdDishThread extends Thread{
	
	@Override
	public void run() {
		try {
			Thread.sleep(1000);
			System.out.println("涼菜準備完畢");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
 
}
	public static void main(String[] args) throws InterruptedException {
		long start = System.currentTimeMillis();
		
		// 等涼菜 -- 必須要等待返回的結果,所以要調用join方法
		Thread t1 = new ColdDishThread();
		t1.start();
		t1.join();
		
		// 等包子 -- 必須要等待返回的結果,所以要調用join方法
		Thread t2 = new BumThread();
		t2.start();
		t2.join();
		
		long end = System.currentTimeMillis();
		System.out.println("準備完畢時間:"+(end-start));
	}

采用Future模式:

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		long start = System.currentTimeMillis();
		
		// 等涼菜 
		Callable ca1 = new Callable(){
 
			@Override
			public String call() throws Exception {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				return "涼菜準備完畢";
			}
		};
		FutureTask<String> ft1 = new FutureTask<String>(ca1);
		new Thread(ft1).start();
		
		// 等包子 -- 必須要等待返回的結果,所以要調用join方法
		Callable ca2 = new Callable(){
 
				@Override
				public Object call() throws Exception {
					try {
						Thread.sleep(1000*3);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					return "包子準備完畢";
			}
		};
		FutureTask<String> ft2 = new FutureTask<String>(ca2);
		new Thread(ft2).start();
		
		System.out.println(ft1.get());
		System.out.println(ft2.get());
		
		long end = System.currentTimeMillis();
		System.out.println("準備完畢時間:"+(end-start));
	}

到此這篇關于Java多線程中的Future類詳細解讀的文章就介紹到這了,更多相關Java的Future類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解利用Spring的AbstractRoutingDataSource解決多數據源的問題

    詳解利用Spring的AbstractRoutingDataSource解決多數據源的問題

    本篇文章主要介紹了詳解利用Spring的AbstractRoutingDataSource解決多數據源的問題。具有一定的參考價值,有興趣的可以了解一下。
    2017-03-03
  • Java?EasyExcel導入帶圖片的完整過程記錄

    Java?EasyExcel導入帶圖片的完整過程記錄

    這篇文章主要介紹了關于結合EasyExcel和ApachePOI來實現(xiàn)Excel數據批量導入并讀取圖片的過程,文中通過圖文以及代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • 詳解mybatis三種分頁方式

    詳解mybatis三種分頁方式

    本文主要介紹了詳解mybatis三種分頁方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • SpringBoot集成圖片驗證碼框架easy-captcha的詳細過程

    SpringBoot集成圖片驗證碼框架easy-captcha的詳細過程

    本文介紹了如何將Easy-Captcha框架集成到SpringBoot項目中,實現(xiàn)圖片驗證碼功能,Easy-Captcha是一款輕量級的開源驗證碼框架,通過簡潔的API和高度可定制性,可以快速實現(xiàn)驗證碼功能,文章詳細介紹了如何配置、生成和展示驗證碼,并提供了Easy-Captcha的GitHub地址
    2025-03-03
  • Java?9中的"菱形"語法詳解

    Java?9中的"菱形"語法詳解

    Java?9?再次增強了“菱形”語法,它甚至允許在創(chuàng)建匿名內部類時使用菱形語法,Java?可根據上下文來推斷匿名內部類中泛型的類型,下面程序示范了在匿名內部類中使用菱形語法,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • 一鍵清除maven倉庫中下載失敗的jar包的實現(xiàn)方法

    一鍵清除maven倉庫中下載失敗的jar包的實現(xiàn)方法

    這篇文章主要介紹了一鍵清除maven倉庫中下載失敗的jar包的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java應用打包后運行需要注意編碼問題

    Java應用打包后運行需要注意編碼問題

    這篇文章主要介紹了 Java應用打包后運行需要注意編碼問題的相關資料,需要的朋友可以參考下
    2016-12-12
  • SpringbBoot實現(xiàn)Tomcat集群的會話管理的詳細過程

    SpringbBoot實現(xiàn)Tomcat集群的會話管理的詳細過程

    文章介紹了如何使用Nginx作為負載均衡器和SpringSession配合Redis實現(xiàn)Tomcat集群的會話共享,確??绻?jié)點訪問時會話的一致性和持久性,通過具體的步驟和示例代碼,感興趣的朋友一起看看吧
    2024-12-12
  • Spring基于注解管理bean實現(xiàn)方式講解

    Spring基于注解管理bean實現(xiàn)方式講解

    很多時候我們需要根據不同的條件在容器中加載不同的Bean,或者根據不同的條件來選擇是否在容器中加載某個Bean,這就是Bean的加載控制,一般我們可以通過編程式或注解式兩種不同的方式來完成Bean的管理
    2023-01-01
  • 解決SpringBoot運行報錯:找不到或無法加載主類的問題

    解決SpringBoot運行報錯:找不到或無法加載主類的問題

    這篇文章主要介紹了解決SpringBoot運行報錯:找不到或無法加載主類的問題,具有很好的參考價值,對大家的學習或工作有一定的參考價值,需要的朋友可以參考下
    2023-09-09

最新評論