亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-11 14:08:21 來源:腳本之家 閱讀:138 作者:zheng12tian 欄目:編程語言

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。可能由于正常終止、異常或取消而完成,在所有這些情況中,此方法都將返回true。

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

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

Future<V>接口

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

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多線程之顯示鎖和內置鎖總結詳解

Java多線程中斷機制三種方法及示例

java多線程編程實例

如有不足之處,歡迎留言指出。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

寻乌县| 琼中| 黑水县| 行唐县| 砚山县| 阿合奇县| 堆龙德庆县| 阳谷县| 临朐县| 赤壁市| 辽源市| 浦县| 清河县| 江永县| 德令哈市| 桂阳县| 尼勒克县| 霍州市| 慈溪市| 新宁县| 罗定市| 新丰县| 丽水市| 都安| 龙胜| 资兴市| 莲花县| 霸州市| 喀什市| 垫江县| 黑河市| 盐池县| 寻乌县| 甘泉县| 咸阳市| 伊春市| 镇雄县| 武川县| 上饶县| 策勒县| 涿鹿县|