Executor框架的兩級(jí)調(diào)度模型

在HotSpot VM的模型中,JAVA線程被一對(duì)一映射為本地操作系統(tǒng)線程。JAVA線程啟動(dòng)時(shí)會(huì)創(chuàng)建一個(gè)本地操作系統(tǒng)線程,當(dāng)JAVA線程終止時(shí),對(duì)應(yīng)的操作系統(tǒng)線程也被銷毀回收,而操作系統(tǒng)會(huì)調(diào)度所有線程并將它們分配給可用的CPU。

在上層,JAVA程序會(huì)將應(yīng)用分解為多個(gè)任務(wù),然后使用應(yīng)用級(jí)的調(diào)度器(Executor)將這些任務(wù)映射成固定數(shù)量的線程;在底層,操作系統(tǒng)內(nèi)核將這些線程映射到硬件處理器上。

Executor框架類圖

在前面介紹的JAVA線程既是工作單元,也是執(zhí)行機(jī)制。而在Executor框架中,我們將工作單元與執(zhí)行機(jī)制分離開來(lái)。Runnable和Callable是工作單元(也就是俗稱的任務(wù)),而執(zhí)行機(jī)制由Executor來(lái)提供。這樣一來(lái)Executor是基于生產(chǎn)者消費(fèi)者模式的,提交任務(wù)的操作相當(dāng)于生成者,執(zhí)行任務(wù)的線程相當(dāng)于消費(fèi)者。

1、從類圖上看,Executor接口是異步任務(wù)執(zhí)行框架的基礎(chǔ),該框架能夠支持多種不同類型的任務(wù)執(zhí)行策略。

public interface Executor { void execute(Runnable command);
}

Executor接口就提供了一個(gè)執(zhí)行方法,任務(wù)是Runnbale類型,不支持Callable類型。


2、ExecutorService接口實(shí)現(xiàn)了Executor接口,主要提供了關(guān)閉線程池和submit方法: