亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java多線程編程同步器Future和FutureTask解析及代碼示例

2024-07-13 10:13:55
字體:
來源:轉載
供稿:網友

publicinterfaceFuture<V>Future表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,并獲取計算的結果。計算完成后只能使用get方法來獲取結果,如有必要,計算完成前可以阻塞此方法。取消則由cancel方法來執行。還提供了其他方法,以確定任務是正常完成還是被取消了。一旦計算完成,就不能再取消計算。如果為了可取消性而使用Future但又不提供可用的結果,則可以聲明Future<?>形式類型、并返回null作為底層任務的結果。

Future主要定義了5個方法:

1)booleancancel(booleanmayInterruptIfRunning):試圖取消對此任務的執行。如果任務已完成、或已取消,或者由于某些其他原因而無法取消,則此嘗試將失敗。當調用cancel時,如果調用成功,而此任務尚未啟動,則此任務將永不運行。如果任務已經啟動,則mayInterruptIfRunning參數確定是否應該以試圖停止任務的方式來中斷執行此任務的線程。此方法返回后,對isDone()的后續調用將始終返回true。如果此方法返回true,則對isCancelled()的后續調用將始終返回true。

2)booleanisCancelled():如果在任務正常完成前將其取消,則返回true。

3)booleanisDone():如果任務已完成,則返回true??赡苡捎谡=K止、異?;蛉∠瓿?,在所有這些情況中,此方法都將返回true。

4)Vget()throwsInterruptedException,ExecutionException:如有必要,等待計算完成,然后獲取其結果。

5)Vget(longtimeout,TimeUnitunit)throwsInterruptedException,ExecutionException,TimeoutException:如有必要,最多等待為使計算完成所給定的時間之后,獲取其結果(如果結果可用)。

Future<V>接口

Future<V>接口是用來獲取異步計算結果的,說白了就是對具體的Runnable或者Callable對象任務執行的結果進行獲取(get()),取消(cancel()),判斷是否完成等操作。我們看看Future接口的源碼:

java/222752.html">java;">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; } 

方法解析:

Vget():獲取異步執行的結果,如果沒有結果可用,此方法會阻塞直到異步計算完成。

Vget(Longtimeout,TimeUnitunit):獲取異步執行結果,如果沒有結果可用,此方法會阻塞,但是會有時間限制,如果阻塞時間超過設定的timeout時間,該方法將拋出異常。

booleanisDone():如果任務執行結束,無論是正常結束或是中途取消還是發生異常,都返回true。

booleanisCanceller():如果任務完成前被取消,則返回true。

booleancancel(booleanmayInterruptRunning):如果任務還沒開始,執行cancel(...)方法將返回false;如果任務已經啟動,執行cancel(true)方法將以中斷執行此任務線程的方式來試圖停止任務,如果停止成功,返回true;當任務已經啟動,執行cancel(false)方法將不會對正在執行的任務線程產生影響(讓線程正常執行到完成),此時返回false;當任務已經完成,執行cancel(...)方法將返回false。mayInterruptRunning參數表示是否中斷執行中的線程。

通過方法分析我們也知道實際上Future提供了3種功能:(1)能夠中斷執行中的任務(2)判斷任務是否執行完成(3)獲取任務執行完成后額結果。

但是我們必須明白Future只是一個接口,我們無法直接創建對象,因此就需要其實現類FutureTask登場啦。

FutureTask類

FutureTask可用于異步獲取執行結果或取消執行任務的場景。通過傳入Runnable或者Callable的任務給FutureTask,直接調用其run方法或者放入線程池執行,之后可以在外部通過FutureTask的get方法異步獲取執行結果,因此,FutureTask非常適合用于耗時的計算,主線程可以在完成自己的任務后,再去獲取結果。另外,FutureTask還可以確保即使調用了多次run方法,它都只會執行一次Runnable或者Callable任務,或者通過cancel取消FutureTask的執行等。

我們來看看FutureTask的實現

public class FutureTask<V> implements RunnableFuture<V> { 

FutureTask類實現了RunnableFuture接口,我們看一下RunnableFuture接口的實現:

public interface RunnableFuture<V> extends Runnable, Future<V> {  void run(); } 

分析:FutureTask除了實現了Future接口外還實現了Runnable接口,因此FutureTask也可以直接提交給Executor執行。當然也可以調用線程直接執行(FutureTask.run())。接下來我們根據FutureTask.run()的執行時機來分析其所處的3種狀態:

(1)未啟動,FutureTask.run()方法還沒有被執行之前,FutureTask處于未啟動狀態,當創建一個FutureTask,而且沒有執行FutureTask.run()方法前,這個FutureTask也處于未啟動狀態。

(2)已啟動,FutureTask.run()被執行的過程中,FutureTask處于已啟動狀態。

(3)已完成,FutureTask.run()方法執行完正常結束,或者被取消或者拋出異常而結束,FutureTask都處于完成狀態。

FutureTask類是Future的一個實現,并實現了Runnable,所以可通過Excutor(線程池)來執行。也可傳遞給Thread對象執行。如果在主線程中需要執行比較耗時的操作時,但又不想阻塞主線程時,可以把這些作業交給Future對象在后臺完成,當主線程將來需要時,就可以通過Future對象獲得后臺作業的計算結果或者執行狀態。下面的例子模擬一個會計算賬的過程,主線程已經獲得其他帳戶的總額了,為了不讓主線程等待PrivateAccount類的計算結果的返回而啟用新的線程去處理,并使用FutureTask對象來監控,這樣,主線程還可以繼續做其他事情,最后需要計算總額的時候再嘗試去獲得privateAccount的信息。

package test;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/** * * @author Administrator * */@SuppressWarnings("all")public class FutureTaskDemo {	public static void main(String[] args) {		// 初始化一個Callable對象和FutureTask對象		Callable pAccount = new PrivateAccount();		FutureTask futureTask = new FutureTask(pAccount);		// 使用futureTask創建一個線程		Thread pAccountThread = new Thread(futureTask);		System.out.println("futureTask線程現在開始啟動,啟動時間為:" + System.nanoTime());		pAccountThread.start();		System.out.println("主線程開始執行其他任務");		// 從其他賬戶獲取總金額		int totalMoney = new Random().nextint(100000);		System.out.println("現在你在其他賬戶中的總金額為" + totalMoney);		System.out.println("等待私有賬戶總金額統計完畢...");		// 測試后臺的計算線程是否完成,如果未完成則等待		while (!futureTask.isDone()) {			try {				Thread.sleep(500);				System.out.println("私有賬戶計算未完成繼續等待...");			}			catch (InterruptedException e) {				e.printStackTrace();			}		}		System.out.println("futureTask線程計算完畢,此時時間為" + System.nanoTime());		Integer privateAccountMoney = null;		try {			privateAccountMoney = (Integer) futureTask.get();		}		catch (InterruptedException e) {			e.printStackTrace();		}		catch (ExecutionException e) {			e.printStackTrace();		}		System.out.println("您現在的總金額為:" + totalMoney + privateAccountMoney.intValue());	}}@SuppressWarnings("all")class PrivateAccount implements Callable {	Integer totalMoney;	@Override		public Object call() throws Exception {		Thread.sleep(5000);		totalMoney = new Integer(new Random().nextint(10000));		System.out.println("您當前有" + totalMoney + "在您的私有賬戶中");		return totalMoney;	}}

運行結果 

futureTask線程現在開始啟動,啟動時間為:3098040622063 
主線程開始執行其他任務 
現在你在其他賬戶中的總金額為56983 
等待私有賬戶總金額統計完畢... 
私有賬戶計算未完成繼續等待... 
私有賬戶計算未完成繼續等待... 
私有賬戶計算未完成繼續等待... 
私有賬戶計算未完成繼續等待... 
私有賬戶計算未完成繼續等待... 
私有賬戶計算未完成繼續等待... 
私有賬戶計算未完成繼續等待... 
私有賬戶計算未完成繼續等待... 
私有賬戶計算未完成繼續等待... 
您當前有3345在您的私有賬戶中 
私有賬戶計算未完成繼續等待... 
futureTask線程計算完畢,此時時間為3103072404138 
您現在的總金額為:569833345

總結

以上就是本文關于java多線程編程同步器Future和FutureTask解析及代碼示例的全部內容,希望對大家有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91国在线精品国内播放| 日日狠狠久久偷偷四色综合免费| 成人久久久久爱| 欧美日韩国产精品一区二区不卡中文| 欧美大片va欧美在线播放| 欧美中文字幕在线观看| 国内精品模特av私拍在线观看| 92版电视剧仙鹤神针在线观看| 欧美丝袜美女中出在线| 国产精品久久久久高潮| 成人久久18免费网站图片| 亚洲电影免费观看高清完整版在线观看| 亚洲精品免费在线视频| 欧美老女人xx| 欧美精品中文字幕一区| 亚洲日韩中文字幕在线播放| 欧美激情xxxx性bbbb| 热99精品里视频精品| 日韩欧美在线视频免费观看| 精品国产欧美一区二区三区成人| 亚洲激情久久久| 久久久久久久久中文字幕| 5566成人精品视频免费| 久久人人爽人人爽人人片亚洲| 综合网日日天干夜夜久久| 亚洲石原莉奈一区二区在线观看| 韩日精品中文字幕| 日韩电影在线观看免费| 久久免费福利视频| 美女啪啪无遮挡免费久久网站| 欧美限制级电影在线观看| 亚洲激情视频在线观看| 国产精品黄页免费高清在线观看| 日韩在线一区二区三区免费视频| 久久精品国产一区二区电影| 91网站免费观看| 国产狼人综合免费视频| 亚洲性生活视频在线观看| 91精品国产99| 亚洲偷欧美偷国内偷| www.亚洲一二| 欧美黑人性生活视频| 精品美女永久免费视频| 日韩精品久久久久| 成人免费直播live| 51视频国产精品一区二区| 色哟哟亚洲精品一区二区| 91午夜在线播放| 精品一区二区三区电影| 国产精品福利网站| 欧美老妇交乱视频| 日本亚洲欧洲色α| 成人黄色大片在线免费观看| 欧美激情中文字幕乱码免费| 66m—66摸成人免费视频| 国产精品成人aaaaa网站| 日韩在线一区二区三区免费视频| 麻豆一区二区在线观看| 国产精品91久久| 国产成人极品视频| 懂色av中文一区二区三区天美| 亚洲人成在线播放| 亚洲精品xxxx| 欧美在线观看网址综合| 久热爱精品视频线路一| 久久在线免费视频| 日韩一中文字幕| 日韩在线观看免费| 一区二区欧美日韩视频| 国产亚洲精品久久久久久| 国产高清视频一区三区| 奇米4444一区二区三区| 久久免费高清视频| 国产中文字幕91| 欧美老女人xx| 久久久国产精品视频| 伊人久久久久久久久久久| 国产精品中文字幕在线观看| 久久精品国产免费观看| 在线精品高清中文字幕| 亚洲第一综合天堂另类专| 国产区精品视频| 色综合久久中文字幕综合网小说| 欧美成人免费全部观看天天性色| 亚洲午夜国产成人av电影男同| www.久久色.com| 人人爽久久涩噜噜噜网站| 三级精品视频久久久久| 国产视频精品免费播放| 久久91超碰青草是什么| 国产精品久久久久aaaa九色| 操人视频在线观看欧美| 午夜精品视频网站| 亚洲国产欧美一区二区丝袜黑人| 久久免费国产视频| 亚洲国产精品久久91精品| 日韩精品免费看| 中文字幕亚洲一区在线观看| 亚洲男人天堂2023| 欧洲一区二区视频| 久久综合免费视频| 日韩亚洲欧美中文在线| 中文字幕精品网| 欧美色图在线视频| 亚洲精品丝袜日韩| 久久久久久久一| 精品动漫一区二区三区| 亚洲成人xxx| 国产亚洲精品日韩| 欧美壮男野外gaytube| 亚洲第一区第一页| 亚洲一区二区三区xxx视频| 亚州国产精品久久久| 久久人人爽人人爽人人片av高清| 成人中文字幕在线观看| 国产福利视频一区| 伊人久久久久久久久久| 欧美国产亚洲视频| 精品国产91久久久久久老师| 久久人人爽人人爽人人片av高请| 欧美美女18p| xxav国产精品美女主播| 91系列在线观看| 日韩在线免费观看视频| 色多多国产成人永久免费网站| 久久亚洲国产精品| 欧美资源在线观看| 国产99视频精品免视看7| 性色av一区二区三区| 国产一区二区动漫| 欧美电影免费观看高清| 久久777国产线看观看精品| 国产成人激情小视频| 欧美日韩亚洲一区二| 国产精品免费观看在线| 中文字幕一区二区三区电影| 亚洲国产成人精品久久| 亚洲美女免费精品视频在线观看| 欧美精品18videos性欧美| 欧美日韩国产成人在线观看| 日韩欧美在线视频日韩欧美在线视频| 视频在线一区二区| 精品亚洲一区二区三区| 国产日韩综合一区二区性色av| 午夜剧场成人观在线视频免费观看| 欧美片一区二区三区| 亚洲成年人在线| 伊人久久久久久久久久久| 精品久久久久久久久久久久久久| 亚洲人成网7777777国产| 国产成人在线一区二区| 成人黄色午夜影院| 日韩av在线免费播放| 黄色一区二区在线观看| 日本免费久久高清视频| 77777亚洲午夜久久多人| 欧美在线一区二区三区四| 国产亚洲精品久久久久久牛牛| 亚洲区在线播放| 在线播放国产一区二区三区| 欧美在线一级va免费观看| 久久福利视频导航| 中文在线资源观看视频网站免费不卡| 国内精品400部情侣激情|