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

首頁 > 編程 > Java > 正文

Java并發編程:Callable、Future和FutureTask

2019-11-06 06:15:03
字體:
來源:轉載
供稿:網友

請尊重作者勞動成果,

java并發編程:Callable、Future和FutureTask

在前面的文章中我們講述了創建線程的2種方式,一種是直接繼承Thread,另外一種就是實現Runnable接口。

  這2種方式都有一個缺陷就是:在執行完任務之后無法獲取執行結果。

  如果需要獲取執行結果,就必須通過共享變量或者使用線程通信的方式來達到效果,這樣使用起來就比較麻煩。

  而自從Java 1.5開始,就提供了Callable和Future,通過它們可以在任務執行完畢之后得到任務執行結果。

  

今天我們就來討論一下Callable、Future和FutureTask三個類的使用方法。以下是本文的目錄大綱:

  一.Callable與Runnable

  二.Future

  三.FutureTask

  四.使用示例

  若有不正之處請多多諒解,并歡迎批評指正。

  

  

一.Callable與Runnable

  先說一下java.lang.Runnable吧,它是一個接口,在它里面只聲明了一個run()方法:

123public interface Runnable {    public abstract void run();}

   由于run()方法返回值為void類型,所以在執行完任務之后無法返回任何結果。

  Callable位于java.util.concurrent包下,它也是一個接口,在它里面也只聲明了一個方法,只不過這個方法叫做call():

123456789public interface Callable<V> {    /**     * Computes a result, or throws an exception if unable to do so.     *     * @return computed result     * @throws Exception if unable to compute a result     */    V call() throws Exception;}

   可以看到,這是一個泛型接口,call()函數返回的類型就是傳遞進來的V類型。

  那么怎么使用Callable呢?一般情況下是配合ExecutorService來使用的,在ExecutorService接口中聲明了若干個submit方法的重載版本:

123<T> Future<T> submit(Callable<T> task);<T> Future<T> submit(Runnable task, T result);Future<?> submit(Runnable task);

  第一個submit方法里面的參數類型就是Callable。

  暫時只需要知道Callable一般是和ExecutorService配合來使用的,具體的使用方法講在后面講述。

  一般情況下我們使用第一個submit方法和第三個submit方法,第二個submit方法很少使用。

二.Future

  Future就是對于具體的Runnable或者Callable任務的執行結果進行取消、查詢是否完成、獲取結果。必要時可以通過get方法獲取執行結果,該方法會阻塞直到任務返回結果。

  Future類位于java.util.concurrent包下,它是一個接口:

12345678public 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;}

   在Future接口中聲明了5個方法,下面依次解釋每個方法的作用:

cancel方法用來取消任務,如果取消任務成功則返回true,如果取消任務失敗則返回false。參數mayInterruptIfRunning表示是否允許取消正在執行卻沒有執行完畢的任務,如果設置true,則表示可以取消正在執行過程中的任務。如果任務已經完成,則無論mayInterruptIfRunning為true還是false,此方法肯定返回false,即如果取消已經完成的任務會返回false;如果任務正在執行,若mayInterruptIfRunning設置為true,則返回true,若mayInterruptIfRunning設置為false,則返回false;如果任務還沒有執行,則無論mayInterruptIfRunning為true還是false,肯定返回true。isCancelled方法表示任務是否被取消成功,如果在任務正常完成前被取消成功,則返回 true。isDone方法表示任務是否已經完成,若任務完成,則返回true;get()方法用來獲取執行結果,這個方法會產生阻塞,會一直等到任務執行完畢才返回;get(long timeout, TimeUnit unit)用來獲取執行結果,如果在指定時間內,還沒獲取到結果,就直接返回null。

  也就是說Future提供了三種功能:

  1)判斷任務是否完成;

  2)能夠中斷任務;

  3)能夠獲取任務執行結果。

  因為Future只是一個接口,所以是無法直接用來創建對象使用的,因此就有了下面的FutureTask。

三.FutureTask

  我們先來看一下FutureTask的實現:

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

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

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

   可以看出RunnableFuture繼承了Runnable接口和Future接口,而FutureTask實現了RunnableFuture接口。所以它既可以作為Runnable被線程執行(當作線程時自動調用run方法),又可以作為Future得到Callable的返回值。

  FutureTask提供了2個構造器:

1234public FutureTask(Callable<V> callable) {}public FutureTask(Runnable runnable, V result) {}

  事實上,FutureTask是Future接口的一個唯一實現類。

四.使用示例

  1.使用Callable+Future獲取執行結果

12345678910111213141516171819202122232425262728293031323334353637public class Test {    public static void main(String[] args) {        ExecutorService executor = Executors.newCachedThreadPool();        Task task = new Task();        Future<Integer> result = executor.submit(task);        executor.shutdown();                 try {            Thread.sleep(1000);        catch (InterruptedException e1) {            e1.PRintStackTrace();        }                 System.out.println("主線程在執行任務");                 try {            System.out.println("task運行結果"+result.get());        catch (InterruptedException e) {            e.printStackTrace();        catch (ExecutionException e) {            e.printStackTrace();        }                 System.out.println("所有任務執行完畢");    }}class Task implements Callable<Integer>{    @Override    public Integer call() throws Exception {        System.out.println("子線程在進行計算");        Thread.sleep(3000);        int sum = 0;        for(int i=0;i<100;i++)            sum += i;        return sum;    }}

   執行結果:

 View Code

  2.使用Callable+FutureTask獲取執行結果

123456789101112131415161718192021222324252627282930313233343536373839404142434445public class Test {    public static void main(String[] args) {        //第一種方式        ExecutorService executor = Executors.newCachedThreadPool();        Task task = new Task();        FutureTask<Integer> futureTask = new FutureTask<Integer>(task);        executor.submit(futureTask);        executor.shutdown();                 //第二種方式,注意這種方式和第一種方式效果是類似的,只不過一個使用的是ExecutorService,一個使用的是Thread        /*Task task = new Task();        FutureTask<Integer> futureTask = new FutureTask<Integer>(task);        Thread thread = new Thread(futureTask);        thread.start();*/                 try {            Thread.sleep(1000);        catch (InterruptedException e1) {            e1.printStackTrace();        }                 System.out.println("主線程在執行任務");                 try {            System.out.println("task運行結果"+futureTask.get());        catch (InterruptedException e) {            e.printStackTrace();        catch (ExecutionException e) {            e.printStackTrace();        }                 System.out.println("所有任務執行完畢");    }}class Task implements Callable<Integer>{    @Override    public Integer call() throws Exception {        System.out.println("子線程在進行計算");        Thread.sleep(3000);        int sum = 0;        for(int i=0;i<100;i++)            sum += i;        return sum;    }}

   如果為了可取消性而使用 Future 但又不提供可用的結果,則可以聲明 Future<?> 形式類型、并返回 null 作為底層任務的結果。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕日韩精品在线观看| 91精品国产综合久久久久久蜜臀| 精品日本美女福利在线观看| 精品亚洲一区二区| 成人疯狂猛交xxx| 亚洲最大福利视频网| 中文在线资源观看视频网站免费不卡| 在线视频欧美性高潮| 亚洲一区二区少妇| 亚洲精品美女视频| 国产午夜精品一区理论片飘花| 国产精品久久999| 精品色蜜蜜精品视频在线观看| 国产成+人+综合+亚洲欧洲| 日韩有码视频在线| 久久成人这里只有精品| 久久精品视频99| 伊人伊成久久人综合网站| 高清在线视频日韩欧美| 国产精品一香蕉国产线看观看| 国产乱人伦真实精品视频| 日韩av大片在线| 精品国产成人在线| 亚洲欧美国产va在线影院| 中文字幕日韩av综合精品| 亚洲国产精品久久91精品| 日韩av免费网站| 国产精品视频免费在线观看| 国产精品爱啪在线线免费观看| 国产精品高精视频免费| 亚洲福利在线看| 亚洲国产福利在线| 97婷婷涩涩精品一区| 精品色蜜蜜精品视频在线观看| 亚洲欧美第一页| 久久精品视频在线观看| 国产成人精品日本亚洲| 欧美xxxx14xxxxx性爽| 欧美成人久久久| 性金发美女69hd大尺寸| 欧美精品免费播放| 日韩av电影在线网| 亚洲综合色激情五月| 亚洲aⅴ男人的天堂在线观看| 国产又爽又黄的激情精品视频| 欲色天天网综合久久| 一本色道久久综合狠狠躁篇怎么玩| 一道本无吗dⅴd在线播放一区| 亚洲人成网站在线播| 亚洲网在线观看| 日韩在线播放av| 国产精品欧美一区二区三区奶水| 日韩免费观看在线观看| 亚洲人高潮女人毛茸茸| 亚洲综合精品一区二区| 在线电影欧美日韩一区二区私密| 日韩av最新在线观看| 国产成人aa精品一区在线播放| 日韩经典一区二区三区| 国产精品欧美一区二区| 中文字幕日韩av综合精品| 欧美亚洲视频在线观看| 久久九九全国免费精品观看| 精品国内自产拍在线观看| 日韩在线观看免费高清| 国产精品揄拍500视频| 久久精品视频导航| 91国产精品91| 在线日韩欧美视频| 国产99久久精品一区二区永久免费| 97精品国产97久久久久久免费| 久久久久久伊人| 国产专区欧美专区| 午夜精品www| 6080yy精品一区二区三区| 亚洲精品天天看| 色偷偷88888欧美精品久久久| 久久久久久久亚洲精品| 91成人福利在线| 在线观看欧美成人| 久久精品成人一区二区三区| 国产精品aaa| 国产精品美女久久久免费| 久久精品美女视频网站| 高跟丝袜欧美一区| 色老头一区二区三区| 91tv亚洲精品香蕉国产一区7ujn| 欧美成人第一页| 欧美一级高清免费播放| 亚洲va男人天堂| 中文字幕亚洲综合| 一区二区欧美激情| 亚洲午夜久久久影院| 国产一区二区香蕉| 日韩黄色av网站| 欧美大片网站在线观看| 国产精品福利无圣光在线一区| 欧美日韩国产91| 精品中文字幕在线| 91国内免费在线视频| 国产精品免费看久久久香蕉| 国产成人精品优优av| 热久久免费国产视频| 久久久久久亚洲精品不卡| 国产一区二区动漫| 欧美性生交大片免网| 中文字幕亚洲一区在线观看| 亚洲自拍偷拍一区| 亚洲香蕉成人av网站在线观看| 亚洲白虎美女被爆操| 日韩麻豆第一页| 国产精品扒开腿做爽爽爽男男| 欧美激情一二区| 日韩精品在线观看视频| 国产欧美一区二区白浆黑人| 黄色91在线观看| 久久天堂av综合合色| 日本人成精品视频在线| 日韩色av导航| 国产精品福利观看| 欧美劲爆第一页| 97视频在线观看播放| 国产精品aaaa| 日韩在线观看免费| 亚洲国产私拍精品国模在线观看| 国产精品成人观看视频国产奇米| 久久久久久久香蕉网| 91国语精品自产拍在线观看性色| 久久精品免费播放| 久久久精品国产网站| 色吧影院999| 精品呦交小u女在线| 国产精品va在线播放我和闺蜜| 亚洲美女免费精品视频在线观看| 国产精品爱啪在线线免费观看| 日韩av影视综合网| 欧美视频精品一区| 亚洲一区二区三区毛片| 一本色道久久88亚洲综合88| 久久久久久国产精品三级玉女聊斋| 久久精品国产96久久久香蕉| 色妞在线综合亚洲欧美| 久久久极品av| 久久久久久国产精品三级玉女聊斋| 韩国一区二区电影| 午夜精品三级视频福利| 日韩欧美在线网址| 欧美成人一区二区三区电影| 国产精品久久久久9999| 国产精品一区二区三区免费视频| 久久99久久99精品免观看粉嫩| 国产精品jvid在线观看蜜臀| 91在线高清免费观看| 国产69精品99久久久久久宅男| 国产成人精品综合久久久| 8050国产精品久久久久久| 亚洲福利视频免费观看| 国产在线视频91| 日韩不卡在线观看| 欧美人在线视频| 亚洲精品电影在线| 亚洲精品第一页| 亚洲精品成人久久| 亚洲最大福利网|