日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Java Callable接口實現(xiàn)多線程的方式

瀏覽:79日期:2022-09-02 15:09:45

在Java 1.5以前,創(chuàng)建線程的2種方式,一種是直接繼承Thread,另外一種就是實現(xiàn)Runnable接口。無論我們以怎樣的形式實現(xiàn)多線程,都需要調(diào)用Thread類中的start方法去向操作系統(tǒng)請求io,cup等資源。因為線程run方法沒有返回值,如果需要獲取執(zhí)行結(jié)果,就必須通過共享變量或者使用線程通信的方式來達到效果,這樣使用起來就比較麻煩。

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

Callable和Future介紹

Callable接口代表一段可以調(diào)用并返回結(jié)果的代碼;Future接口表示異步任務,是還沒有完成的任務給出的未來結(jié)果。所以說Callable用于產(chǎn)生結(jié)果,F(xiàn)uture用于獲取結(jié)果。

Callable接口使用泛型去定義它的返回類型。Executors類提供了一些有用的方法在線程池中執(zhí)行Callable內(nèi)的任務。由于Callable任務是并行的(并行就是整體看上去是并行的,其實在某個時間點只有一個線程在執(zhí)行),我們必須等待它返回的結(jié)果。java.util.concurrent.Future對象為我們解決了這個問題。在線程池提交Callable任務后返回了一個Future對象,使用它可以知道Callable任務的狀態(tài)和得到Callable返回的執(zhí)行結(jié)果。Future提供了get()方法讓我們可以等待Callable結(jié)束并獲取它的執(zhí)行結(jié)果。

Callable與Runnable

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

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

由于run()方法返回值為void類型,所以在執(zhí)行完任務之后無法返回任何結(jié)果。Callable位于java.util.concurrent包下,它也是一個接口,在它里面也只聲明了一個方法,只不過這個方法叫做call():

public 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()函數(shù)返回的類型就是傳遞進來的V類型。

那么怎么使用Callable呢?

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

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

Future

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

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

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

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

cancel方法 用來取消任務,如果取消任務成功則返回true,如果取消任務失敗則返回false。參數(shù)mayInterruptIfRunning表示是否允許取消正在執(zhí)行卻沒有執(zhí)行完畢的任務,如果設(shè)置true,則表示可以取消正在執(zhí)行過程中的任務。如果任務已經(jīng)完成,則無論mayInterruptIfRunning為true還是false,此方法肯定返回false,即如果取消已經(jīng)完成的任務會返回false;如果任務正在執(zhí)行,若mayInterruptIfRunning設(shè)置為true,則返回true,若mayInterruptIfRunning設(shè)置為false,則返回false;如果任務還沒有執(zhí)行,則無論mayInterruptIfRunning為true還是false,肯定返回true。

isCancelled方法 表示任務是否被取消成功,如果在任務正常完成前被取消成功,則返回 true。

isDone方法 表示任務是否已經(jīng)完成,若任務完成,則返回true;

get()方法 用來獲取執(zhí)行結(jié)果,這個方法會產(chǎn)生阻塞,會一直等到任務執(zhí)行完畢才返回;

get(long timeout, TimeUnit unit) 用來獲取執(zhí)行結(jié)果,如果在指定時間內(nèi),還沒獲取到結(jié)果,就直接返回null。

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

1)判斷任務是否完成;

2)能夠中斷任務;

3)能夠獲取任務執(zhí)行結(jié)果。

Future用于表示異步計算的結(jié)果。它的實現(xiàn)類有java.util.concurrent.FutureTask<V>和 javax.swing.SwingWorker<T,V>,Android平臺上如果不想分支線程阻塞主線程,又想取得分支線程的執(zhí)行結(jié)果,可以用FutureTask。

FutureTask

Java的類是單繼承的設(shè)計,如果采用繼承Thread的方式實現(xiàn)多線程,則不能繼承其他的類,采用接口能夠更好的實現(xiàn)數(shù)據(jù)共享

FutureTask實現(xiàn)了RunnableFuture接口,這個接口的定義如下:

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

可以看到這個接口實現(xiàn)了Runnable和Future接口,接口中的具體實現(xiàn)由FutureTask來實現(xiàn)。這個類的兩個構(gòu)造方法如下 :

public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); sync = new Sync(callable); } public FutureTask(Runnable runnable, V result) { sync = new Sync(Executors.callable(runnable, result)); }

如上提供了兩個構(gòu)造函數(shù),一個以Callable為參數(shù),另外一個以Runnable為參數(shù)。這些類之間的關(guān)聯(lián)對于任務建模的辦法非常靈活,允許你基于FutureTask的Runnable特性(因為它實現(xiàn)了Runnable接口),把任務寫成Callable,然后封裝進一個由執(zhí)行者調(diào)度并在必要時可以取消的FutureTask。

FutureTask可以由執(zhí)行者調(diào)度,這一點很關(guān)鍵。它對外提供的方法基本上就是Future和Runnable接口的組合:get()、cancel、isDone()、isCancelled()和run(),而run()方法通常都是由執(zhí)行者調(diào)用,我們基本上不需要直接調(diào)用它。FutureTask類同時又實現(xiàn)了Runnable接口,所以可以直接提交給Thread、Executors執(zhí)行:

public class CallableAndFuture { public static void main(String[] args) { Callable<Integer> callable = new Callable<Integer>() { public Integer call() throws Exception { return new Random().nextInt(100); } }; FutureTask<Integer> future = new FutureTask<Integer>(callable); new Thread(future).start(); try { Thread.sleep(5000);// 可能做一些事情int result = future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }

public class CallableAndFuture { public static void main(String[] args) { //ExecutorService.submit() ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future<Integer> future = threadPool.submit(new Callable<Integer>() { public Integer call() throws Exception { return new Random().nextInt(100); } }); try { Thread.sleep(5000);// 可能做一些事情int result = future.get()); //Future.get() } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }

如果要執(zhí)行多個帶返回值的任務,并取得多個返回值,可用CompletionService:

CompletionService相當于Executor加上BlockingQueue,使用場景為當子線程并發(fā)了一系列的任務以后,主線程需要實時地取回子線程任務的返回值并同時順序地處理這些返回值,誰先返回就先處理誰。

public class CallableAndFuture { public static void main(String[] args) { ExecutorService threadPool = Executors.newCachedThreadPool(); CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(threadPool); for(int i = 1; i < 5; i++) { final int taskID = i; //CompletionService.submit() cs.submit(new Callable<Integer>() { public Integer call() throws Exception { return taskID; } }); } // 可能做一些事情 for(int i = 1; i < 5; i++) { try { int result = cs.take().get()); //CompletionService.take()返回Future } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } } }

或者不使用CompletionService:先創(chuàng)建一個裝Future類型的集合,用Executor提交的任務返回值添加到集合中,最后便利集合取出數(shù)據(jù)。

區(qū)別:

Future集合方法,submit的task不一定是按照加入自己維護的list順序完成的。從list中遍歷的每個Future對象并不一定處于完成狀態(tài),這時調(diào)用get()方法就會被阻塞住,如果系統(tǒng)是設(shè)計成每個線程完成后就能根據(jù)其結(jié)果繼續(xù)做后面的事,這樣對于處于list后面的但是先完成的線程就會增加了額外的等待時間。

而CompletionService的實現(xiàn)是維護一個保存Future對象的BlockingQueue。只有當這個Future對象狀態(tài)是結(jié)束的時候,才會加入到這個Queue中,take()方法其實就是Producer-Consumer中的Consumer。它會從Queue中取出Future對象,如果Queue是空的,就會阻塞在那里,直到有完成的Future對象加入到Queue中。

所以,先完成的必定先被取出。這樣就減少了不必要的等待時間。

到此這篇關(guān)于詳解Java Callable接口實現(xiàn)多線程的方式的文章就介紹到這了,更多相關(guān)Java Callable接口多線程內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久激情五月婷婷| 成人在线视频免费看| 日韩欧美综合| 久久中文字幕一区二区三区| 国产亚洲一区二区三区不卡| 日本欧美一区二区在线观看| 日本不卡在线视频| 久久激情五月婷婷| 国产精成人品2018| 国产一区二区亚洲| 综合日韩av| 日韩精品一区二区三区免费观影| а√在线中文在线新版| 日韩精品不卡一区二区| 国产字幕视频一区二区| 欧美特黄一级| 日韩视频一区二区三区在线播放免费观看| 伊人久久亚洲热| 男人的天堂久久精品| 亚洲精品韩国| 国产福利一区二区精品秒拍| 日韩av片子| 好吊日精品视频| 婷婷精品久久久久久久久久不卡| 欧美亚洲tv| zzzwww在线看片免费| 今天的高清视频免费播放成人| 亚洲欧美激情诱惑| 国产日韩高清一区二区三区在线| 国产极品一区| 欧美日韩一区二区三区视频播放| 免费毛片在线不卡| 中文字幕视频精品一区二区三区 | 日本欧洲一区二区| 欧美在线精品一区| 成人国产精选| 黄页网站一区| 日本视频一区二区| 成人片免费看| 蜜桃一区二区三区在线观看| 免费在线观看一区| 亚洲精品在线观看91| 91午夜精品| 91欧美国产| 蜜臀av一区二区在线免费观看| 久久免费影院| 天堂av在线一区| 精品国产欧美| 蜜桃视频免费观看一区| 国产91欧美| 亚洲欧美日韩国产| 久久久精品国产**网站| 激情五月综合网| 久久国产麻豆精品| 久久国产精品成人免费观看的软件| 最新国产精品视频| 日本在线啊啊| 亚洲精品一二| 亚洲91久久| 日韩高清不卡一区| 日韩成人精品一区二区三区 | 热三久草你在线| 91成人在线网站| 国产精品久久久久久久久久10秀| 国产亚洲综合精品| 国产毛片精品| 国产综合精品一区| 欧美视频久久| 亚洲一级高清| 伊人精品一区| 日韩精品一区二区三区av| 日本免费久久| 亚洲伊人精品酒店| 中文字幕在线视频网站| 日韩精品亚洲aⅴ在线影院| 成人自拍av| 国产精品白丝久久av网站| 香蕉久久国产| 久久国产日本精品| 欧美成人aaa| 综合色就爱涩涩涩综合婷婷| 一区二区精品| 鲁大师影院一区二区三区| 不卡一二三区| 国产精品久久久久久久久久妞妞 | 日韩欧美激情电影| 亚洲国产专区| 高清日韩中文字幕| 欧美在线看片| 日本大胆欧美人术艺术动态| 色婷婷精品视频| 久久久久久久欧美精品| 国产亚洲欧洲| 欧美日韩尤物久久| 国产精品超碰| 欧美在线看片| 亚洲天堂免费| 性色一区二区| 亚洲精品99| 久久高清免费| 日韩在线视频精品| 老司机免费视频一区二区三区| 亚洲资源网站| 日本大胆欧美人术艺术动态| 一区在线免费| 黄色免费成人| 99香蕉国产精品偷在线观看| 婷婷成人综合| 国产精品毛片久久久| 亚洲性视频在线| 99久久亚洲精品| 日韩久久精品网| 日韩成人免费| 色爱综合网欧美| 久久精品一本| 成人在线视频中文字幕| 国产精品99久久免费| 国产剧情一区二区在线观看| 国产视频一区二| 欧美三区不卡| 国产日韩一区| 美女免费视频一区| 国内在线观看一区二区三区| 欧美亚洲二区| 国产日韩免费| 你懂的国产精品| 老色鬼精品视频在线观看播放| 久久99青青| 精品日韩在线| 亚洲午夜天堂| 亚洲大全视频| 国产模特精品视频久久久久| 免费看日韩精品| 日韩精品中文字幕一区二区| 日本少妇一区二区| 久久麻豆视频| 在线一区av| 激情综合自拍| 亚洲一区国产| 亚洲免费观看高清完整版在线观| 亚欧成人精品| 欧美日韩亚洲一区二区三区在线| 国产精品第一国产精品| 高清一区二区三区| 国产精品99免费看| 蜜桃视频在线观看一区| 欧美在线精品一区| 国产一区二区三区黄网站| 成人va天堂| 天堂成人免费av电影一区| 日本午夜精品久久久| 中文字幕在线官网| 欧美日韩免费观看一区=区三区| 夜夜嗨av一区二区三区网站四季av| 亚洲一区欧美激情| 啪啪亚洲精品| 国产在线观看91一区二区三区| 蜜臀久久99精品久久久画质超高清| 国产日韩1区| 久久九九精品| 日韩一区二区三区在线看| 久久影院一区二区三区| 欧美1级日本1级| **爰片久久毛片| 中文在线а√在线8| 尤物在线精品| 欧美在线首页| 欧美亚洲激情| 深夜日韩欧美| 福利片在线一区二区 | 国产传媒在线观看| 黄色成人在线网址| 国产精品一国产精品| 日韩欧美午夜| 日本欧美在线看| 高清一区二区| 亚洲深深色噜噜狠狠爱网站| 国产精品观看| 欧美在线影院| 久久av影院| 午夜久久影院| 国产精品久久亚洲不卡| 日韩欧美午夜| 日本一区二区中文字幕| 日本不良网站在线观看| 亚洲三区欧美一区国产二区| 成人日韩av| 国产精品久久久网站| 制服诱惑一区二区| 精品国产网站| 亚洲精品在线a| 99久久九九| 欧美激情视频一区二区三区免费 | 中文字幕日韩高清在线| 91视频一区| 91亚洲无吗| 国产视频亚洲| 日韩一区二区中文| 国产精品调教| 亚洲少妇自拍|