黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) Java并發(fā)框架視頻之Executor

Java并發(fā)框架視頻之Executor

更新時間:2020-06-04 16:14:05 來源:動力節(jié)點(diǎn) 瀏覽2260次

隨著當(dāng)今處理器中可用的核心數(shù)量的增加,隨著對實(shí)現(xiàn)更高吞吐量的需求的不斷增長,多線程API變得非常流行。Java提供了自己的多線程框架,稱為Executor框架.

Java并發(fā)框架視頻之Executor

1.Executor框架是什么?

Executor框架包含一組用于有效管理工作線程的組件。Executor API通過Executors將任務(wù)的執(zhí)行與要執(zhí)行的實(shí)際任務(wù)解耦。這是生產(chǎn)者-消費(fèi)者模式的一種實(shí)現(xiàn)。

java.util.concurrent.Executors提供了用于創(chuàng)建工作線程的線程池的工廠方法。

為了使用Executor框架,我們需要創(chuàng)建一個線程池并提交任務(wù)給它以供執(zhí)行。Executor框架的工作是調(diào)度和執(zhí)行已提交的任務(wù)并從線程池中拿到返回的結(jié)果。

浮現(xiàn)于腦海中的一個基本的問題是,當(dāng)我們創(chuàng)建java.lang.Thread的對象或調(diào)用實(shí)現(xiàn)了Runnable/Callable接口來達(dá)到的程序的并行性時,為什么需要線程池?

答案來源于兩個基本面:

為新任務(wù)創(chuàng)建新的線程會存在額外的線程創(chuàng)建以及銷毀的開銷。管理這些線程的生命周期會明顯增加CPU的執(zhí)行時間。

不進(jìn)行任何限制地為每個進(jìn)程創(chuàng)建線程會導(dǎo)致創(chuàng)建大量線程。這些線程會占用大量內(nèi)存并引起資源的浪費(fèi)。當(dāng)一個線程利用完CPU的時間片后另一個線程即將利用CPU的時間片時,CPU會花費(fèi)大量的時間來切換線程的上下文。

所有的這些因素都會導(dǎo)致系統(tǒng)的吞吐量下降。線程池通過保持線程一直存活并重用這些線程來克服這個問題。當(dāng)提交到線程池中的任務(wù)多于正在執(zhí)行的線程時,那些多余的任務(wù)將被放到隊列中。一旦執(zhí)行任務(wù)的線程有空閑的了,它們會從隊列中取下一個任務(wù)來執(zhí)行。對于JDK提供的現(xiàn)成的executors此任務(wù)隊列基本是無界的。

2.Executors的類型

現(xiàn)在我們已經(jīng)了解了executors是什么,讓我們來看看不同類型的executors。

(1)SingleThreadExecutor

此線程池executor只有一個線程。它用于以順序方式的形式執(zhí)行任務(wù)。如果此線程在執(zhí)行任務(wù)時因異常而掛掉,則會創(chuàng)建一個新線程來替換此線程,后續(xù)任務(wù)將在新線程中執(zhí)行。

ExecutorService executorService=Executors.newSingleThreadExecutor()

(2)FixedThreadPool(n)

顧名思義,它是一個擁有固定數(shù)量線程的線程池。提交給executor的任務(wù)由固定的n個線程執(zhí)行,如果有更多的任務(wù),它們存儲在LinkedBlockingQueue里。這個數(shù)字n通常跟底層處理器支持的線程總數(shù)有關(guān)。

ExecutorService executorService=Executors.newFixedThreadPool(4);

(3)CachedThreadPool

該線程池主要用于執(zhí)行大量短期并行任務(wù)的場景。與固定線程池不同,此線程池的線程數(shù)不受限制。如果所有的線程都在忙于執(zhí)行任務(wù)并且又有新的任務(wù)到來了,這個線程池將創(chuàng)建一個新的線程并將其提交到executor。只要其中一個線程變?yōu)榭臻e,它就會執(zhí)行新的任務(wù)。如果一個線程有60秒的時間都是空閑的,它們將被結(jié)束生命周期并從緩存中刪除。

但是,如果管理得不合理,或者任務(wù)不是很短的,則線程池將包含大量的活動線程。這可能導(dǎo)致資源紊亂并因此導(dǎo)致性能下降。

ExecutorService executorService=Executors.newCachedThreadPool();

(4)ScheduledExecutor

當(dāng)我們有一個需要定期運(yùn)行的任務(wù)或者我們希望延遲某個任務(wù)時,就會使用此類型的executor。

ScheduledExecutorService scheduledExecService=Executors.newScheduledThreadPool(1);

可以使用scheduleAtFixedRate或scheduleWithFixedDelay在ScheduledExecutor中定期的執(zhí)行任務(wù)。

scheduledExecService.scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit)
scheduledExecService.scheduleWithFixedDelay(Runnable command,long initialDelay,long period,TimeUnit unit)

這兩種方法的主要區(qū)別在于它們對連續(xù)執(zhí)行定期任務(wù)之間的延遲的應(yīng)答。

scheduleAtFixedRate:無論前一個任務(wù)何時結(jié)束,都以固定間隔執(zhí)行任務(wù)。

scheduleWithFixedDelay:只有在當(dāng)前任務(wù)完成后才會啟動延遲倒計時。

3.對于Future對象的理解

可以使用executor返回的

java.util.concurrent.Future對象訪問提交給executor的任務(wù)的結(jié)果。Future可以被認(rèn)為是executor對調(diào)用者的響應(yīng)。

Future<String>result=executorService.submit(callableTask);

如上所述,提交給executor的任務(wù)是異步的,即程序不會等待當(dāng)前任務(wù)執(zhí)行完成,而是直接進(jìn)入下一步。相反,每當(dāng)任務(wù)執(zhí)行完成時,executor在此Future對象中設(shè)置它。

調(diào)用者可以繼續(xù)執(zhí)行主程序,當(dāng)需要提交任務(wù)的結(jié)果時,他可以在這個Future對象上調(diào)用.get()方法來獲取。如果任務(wù)完成,結(jié)果將立即返回給調(diào)用者,否則調(diào)用者將被阻塞,直到executor完成此操作的執(zhí)行并計算出結(jié)果。

如果調(diào)用者不能無限期地等待任務(wù)執(zhí)行的結(jié)果,那么這個等待時間也可以設(shè)置為定時地。可以通過Future.get(long timeout,TimeUnit unit)方法實(shí)現(xiàn),如果在規(guī)定的時間范圍內(nèi)沒有返回結(jié)果,則拋出TimeoutException。調(diào)用者可以處理此異常并繼續(xù)執(zhí)行該程序。

如果在執(zhí)行任務(wù)時出現(xiàn)異常,則對get方法的調(diào)用將拋出一個ExecutionException。

對于Future.get()方法返回的結(jié)果,一個重要的事情是,只有提交的任務(wù)實(shí)現(xiàn)了

java.util.concurrent.Callable接口時才返回Future。如果任務(wù)實(shí)現(xiàn)了Runnable接口,那么一旦任務(wù)完成,對.get()方法的調(diào)用將返回null。

另一個關(guān)注點(diǎn)是Future.cancel(boolean mayInterruptIfRunning)方法。此方法用于取消已提交任務(wù)的執(zhí)行。如果任務(wù)已在執(zhí)行,則executor將嘗試在mayInterruptIfRunning標(biāo)志為true時中斷任務(wù)執(zhí)行。

4.Example:創(chuàng)建和執(zhí)行一個簡單的Executor

我們現(xiàn)在將創(chuàng)建一個任務(wù)并嘗試在fixed pool executor中執(zhí)行它:

public class Task implements Callable<String>{
private String message;
public Task(String message){
this.message=message;
}

?Override
public String call()throws Exception{
return"Hello"+message+"!";
}
}

Task類實(shí)現(xiàn)Callable接口并有一個String類型作為返回值的方法。這個方法也可以拋出Exception。這種向executor拋出異常的能力以及executor將此異常返回給調(diào)用者的能力非常重要,因為它有助于調(diào)用者知道任務(wù)執(zhí)行的狀態(tài)。

現(xiàn)在讓我們來執(zhí)行一下這個任務(wù):

public class ExecutorExample{
public static void main(String[]args){
Task task=new Task("World");
ExecutorService executorService=Executors.newFixedThreadPool(4);
Future<String>result=executorService.submit(task);
try{
System.out.println(result.get());
}catch(InterruptedException|ExecutionException e){
System.out.println("Error occured while executing the submitted task");
e.printStackTrace();
}

executorService.shutdown();
}
}

我們創(chuàng)建了一個具有4個線程數(shù)的FixedThreadPool executors,因為這個demo是在四核處理器上開發(fā)的。如果正在執(zhí)行的任務(wù)執(zhí)行大量I/O操作或花費(fèi)較長時間等待外部資源,則線程數(shù)可能超過處理器的核心數(shù)。

我們實(shí)例化了Task類,并將它提交給executors執(zhí)行。結(jié)果由Future對象返回,然后我們在屏幕上打印。

讓我們運(yùn)行ExecutorExample并查看其輸出:

Hello World!

正如所料,任務(wù)追加了問候語Hello并通過Future object返回結(jié)果。

最后,我們調(diào)用executorService對象上的shutdown來終止所有線程并將資源返回給OS。

.shutdown()方法等待executor完成當(dāng)前提交的任務(wù)。但是,如果要求是立即關(guān)閉executor而不等待,那么我們可以使用.shutdownNow()方法。

任何待執(zhí)行的任務(wù)都將結(jié)果返回到j(luò)ava.util.List對象中。

我們也可以通過實(shí)現(xiàn)Runnable接口來創(chuàng)建同樣的任務(wù):

public class Task implements Runnable{
private String message;
public Task(String message){
this.message=message;
}

public void run(){
System.out.println("Hello"+message+"!");
}
}

當(dāng)我們實(shí)現(xiàn)Runnable時,這里有一些重要的變化。

無法從run()方法得到任務(wù)執(zhí)行的結(jié)果。因此,我們直接在這里打印。

run()方法不可拋出任何已受檢的異常。

Java并發(fā)框架視頻之Executor

Java流行框架視頻教程

MyBatis:http://m.ilovecolors.com.cn/javavideo/127.html

SpringMVC:http://m.ilovecolors.com.cn/javavideo/126.html

Spring:http://m.ilovecolors.com.cn/javavideo/125.html

以上就是動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對“Java并發(fā)框架視頻之Executor”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 成人福利短视频 | 老司机日日摸夜夜摸精品影院 | 老妇激情毛片 | 精品视频在线v | 日本动态120秒免费 日本二区视频 | 97欧美在线看欧美视频免费 | 污在线| 北条麻妃初尝试黑人在线观看 | 成人在线观看网站 | 国产成人18黄禁网站免费观看 | 在线a人片免费观看高清 | 国产大学生一级毛片绿象 | 日韩爽爽视频爽爽 | 视频网站入口在线看 | 天天骑天天射 | 亚洲欧美日本韩国 | 日日噜噜夜夜狠狠视频buoke | 精品国产一区二区三区19 | 亚洲天堂视频在线免费观看 | 日日射天天干 | 国产伦精品一区二区 | 男女网站在线观看 | 国产成人综合久久综合 | 三级伦理在线 | 91精品成人免费国产片 | 日韩欧美中文字幕在线视频 | 国产在线99 | 欧美羞羞| 99久久网站 | 第一页在线播放 | 成人欧美一区二区三区黑人 | 毛片视频网 | 日韩中文精品亚洲第三区 | 小明永久视频免费播放 | 日韩视频免费一区二区三区 | 日本系列 1页 亚洲系列 | 久久精品94精品久久精品动漫 | 亚洲欧美一区二区三区图片 | 26uuu在线视频| 欧美精品在线观看 | 久久综合中文字幕一区二区 |