国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - JAVA教程 - java多線程編程同步器Future和FutureTask解析及代碼示例

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

2021-02-07 12:19zheng12tian JAVA教程

這篇文章主要介紹了java多線程編程同步器Future和FutureTask解析及代碼示例,對二者進行了詳細介紹,分析了future的源碼,最后展示了相關(guān)實例代碼,具有一定參考價值 ,需要的朋友可以了解下。

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

Future主要定義了5個方法:

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

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

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

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

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

Future<V>接口

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

java" id="highlighter_77206">
?
1
2
3
4
5
6
7
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():獲取異步執(zhí)行的結(jié)果,如果沒有結(jié)果可用,此方法會阻塞直到異步計算完成。

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

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

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

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

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

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

FutureTask類

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

我們來看看FutureTask的實現(xiàn)

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

FutureTask類實現(xiàn)了RunnableFuture接口,我們看一下RunnableFuture接口的實現(xiàn):

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

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

(1)未啟動,F(xiàn)utureTask.run()方法還沒有被執(zhí)行之前,F(xiàn)utureTask處于未啟動狀態(tài),當創(chuàng)建一個FutureTask,而且沒有執(zhí)行FutureTask.run()方法前,這個FutureTask也處于未啟動狀態(tài)。

(2)已啟動,F(xiàn)utureTask.run()被執(zhí)行的過程中,F(xiàn)utureTask處于已啟動狀態(tài)。

(3)已完成,F(xiàn)utureTask.run()方法執(zhí)行完正常結(jié)束,或者被取消或者拋出異常而結(jié)束,F(xiàn)utureTask都處于完成狀態(tài)。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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創(chuàng)建一個線程
        Thread pAccountThread = new Thread(futureTask);
        System.out.println("futureTask線程現(xiàn)在開始啟動,啟動時間為:" + System.nanoTime());
        pAccountThread.start();
        System.out.println("主線程開始執(zhí)行其他任務(wù)");
        // 從其他賬戶獲取總金額
        int totalMoney = new Random().nextint(100000);
        System.out.println("現(xiàn)在你在其他賬戶中的總金額為" + totalMoney);
        System.out.println("等待私有賬戶總金額統(tǒng)計完畢...");
        // 測試后臺的計算線程是否完成,如果未完成則等待
        while (!futureTask.isDone()) {
            try {
                Thread.sleep(500);
                System.out.println("私有賬戶計算未完成繼續(xù)等待...");
            }
            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("您現(xiàn)在的總金額為:" + 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;
    }
}

運行結(jié)果 

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

總結(jié)

以上就是本文關(guān)于java多線程編程同步器Future和FutureTask解析及代碼示例的全部內(nèi)容,希望對大家有所幫助。如有不足之處,歡迎留言指出。

原文鏈接:http://zheng12tian.iteye.com/blog/991484

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品国产高清久久久久久久久 | 亚洲综合首页 | 久久综合九色综合网站 | 国产成人一区二区三区 | 午夜在线电影 | 久久九九 | 久久免费99精品久久久久久 | 国产高清精品在线 | 密臀av| a免费在线 | 免费av片在线 | www麻豆| 日韩三级av在线 | 精品免费视频 | 中文字幕在线综合 | 亚洲毛片在线观看 | 欧美福利 | 国产精品99久久久久久www | 亚洲欧美在线视频 | 久久国产精品久久 | 成人精品一区二区三区 | 欧美一区二区三区免费视频 | 欧美日韩在线看 | 日韩资源| 国产一区视频在线 | av电影免费观看 | 精品成人一区 | 亚洲精品国产综合 | 欧美日韩精品在线 | 国产精品成人国产乱一区 | 国内自拍第一页 | 中文字幕在线免费看 | 久久99精| 国产精品久久久久久久久久新婚 | 国产精品一区久久久 | 亚洲生活片 | 欧美精品| 黄色一级毛片网站 | 国产精品亚洲一区二区三区在线 | 国产一区二区视频在线观看 | 99精品视频一区二区三区 |