1. 程式人生 > >Executor執行框架原始碼分析(一)——executor、threadFactory、ThreadPoolExecutor 、Future元件的關係及作用

Executor執行框架原始碼分析(一)——executor、threadFactory、ThreadPoolExecutor 、Future元件的關係及作用

       executor執行框架是JDK1.5新增的,用於專注於任務執行的框架。其最大的特點就是將任務的建立和任務的執行分離,鬆耦合,已達到最大限度的利用計算機資源(執行緒和記憶體等)。在併發程式設計中,executor是一個必備的工具。

     在分析原始碼之前,首先需要對executor框架的整體結構有一定了解,以保證在進行原始碼分析時,可以有很好的分析路線,不至於被繞暈。excutor框架最頂層是由四個部分構成:
       1、ThreadFactory : 負責執行緒的建立,任務的執行是依靠執行緒完成的。
       2、Executor : 負責執行緒的執行。
       4、ThreadPoolExecutor : 負責對ThreadFactory建立的執行緒進行管理和排程。
       3、Future  :   獲取任務的結果。因為任務是被放入執行緒中,啟動執行緒進行非同步執行。此時就需要一個物件來接收非同步計算的結果(沒有結果,也是一種特殊的結果)。Future就是用來接收這個返回結果的。這個結果可以是預期的結果,也可以是一個異常(Exception)。

一 、 ThreadFactory 

       ThreadFactory是一個介面,其中只有一個方法,即newThread(Runnable r)。從這個方法名字就可以知道,這介面是用來建立新的執行緒的。其使用也很簡單,僅僅只需要實現newThread方法,根據自己的需要進行執行緒的建立即可。採用這種工廠方法的方式建立執行緒的優勢在於,使用者可以根據自己的需要進行執行緒的建立,同時使用者也可以自定義執行緒工廠,比如儲存執行緒建立執行緒的數量的ThreadFactory,建立特定優先順序的執行緒的TrheadFacotry等等。

二、Executor

       Executor也是一個介面,介面只有一個execute(Runnable command)方法。從發名字就可以知曉,這個方法是用於執行執行緒的。但是,Executor的定義過於單一,比如:當我們一次提交多個Runnable時,沒有類似executorAny、executorAll這樣的方法,用於執行任意Runnable和所有Runnable的方法。因此,Executor框架中提供了另外一個介面,即ExecutorService。ExecutorService是Executor的子介面。下面是ExecutorService中定義的方法:

   
    void shutdown();

    List<Runnable> shutdownNow();

    boolean isShutdown();

    boolean isTerminated();

    boolean awaitTermination(long timeout, TimeUnit unit)

    <T> Future<T> submit(Callable<T> task);

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

    Future<?> submit(Runnable task);

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit)

    <T> T invokeAny(Collection<? extends Callable<T>> tasks) 
	
    <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)

ExecutorService擴充套件了Executor介面,定義各種各樣的執行緒執行方式(invokeAny、 invokeAll等)。進行了這種分離之後,Executor和ExecutorService的各自的職責就很清晰了,更符合面向物件的程式設計思想。

三、ThreadPoolExecutor 

       ThreadPoolExecutor是一個類,其主要維護兩個重要的資源:第一,執行緒(Thread);第二,任務(task)。因此,ThreadPoolExecutor 有兩個很重要的屬性: workers,workQueue。workers是一個HashSet<Worker>集合,這裡的泛型Worker物件中持有一個Thread,也就是說workers是一個執行緒集合。workQueue是BlockingQueue<Runnable>佇列,用於儲存新增的且沒有被執行的task。

       ThreadPoolExecutor主要用於解決兩個問題:第一,優化效能,ThreadPoolExecutor採用執行緒池的方式實現,可以執行緒執行緒的數量,減少執行緒上下文的切換和計算資源的耗盡。此外,ThreadPoolExecutor的執行緒池可以重複利用執行緒,減少資源浪費,提升效能。第二,執行緒和資源的管理,ThreadPoolExecutor維護眾多的屬性,比如:已完成任務的數量、活躍的執行緒數量、任務拒絕策略、超時時間等等。

四、Future

       Future用於獲取任務的結果。因為任務是被放入執行緒中執行的,整個執行是非同步的。因此,當任務執行完成後,需要一個物件來接收非同步計算的結果(沒有結果,也是一種特殊的結果)。Future就是用來接收這個返回結果的。這個結果可以是預期的結果,也可以是一個異常(Exception)。

      綜上所述,在Executor框架中,首先通過ThreadFactory建立執行緒;緊接著,通過ThreadPoolExecutor來管理ThreadFactory建立的執行緒和需要執行的任務;等到執行的時機成熟,則使用Executor來執行具體的任務;最後,通過Future物件來獲取任務的執行結果。

相關推薦

Executor執行框架原始碼分析——executorthreadFactoryThreadPoolExecutor Future元件關係作用

       executor執行框架是JDK1.5新增的,用於專注於任務執行的框架。其最大的特點就是將任務的建立和任務的執行分離,鬆耦合,已達到最大限度的利用計算機資源(執行緒和記憶體等)。在併發程式設計中,executor是一個必備的工具。     在分析原始碼之前,首先

laravel框架原始碼分析自動載入

一、前言   使用php已有好幾年,laravel的使用也是有好長時間,但是一直對於框架原始碼的理解不深,原因很多,歸根到底還是php基礎不紮實,所以原始碼看起來也比較吃力。最近有時間,所以開啟第5、6遍的框架原始碼探索之旅,前面幾次都是看了一些就放棄,希望這次能夠看完。每一次看原始碼都會有新的收穫,因為框

新手解讀:laravel 框架原始碼分析

眾所周知,php的框架數不勝數,近幾年,一個以優雅著稱的框架,漸漸被國內phper所知道,並且開始使用,但是larave有一個很明顯的缺點就是,他的文件內容少的可憐。而且國內的社群也不是很活躍。所以對使用這款框架的新書造成了很大困難。 作者作為一個入門也沒多久的新手,

物件池commons-pool框架的研究以及原始碼分析

    物件池是一個物件集合,用於將建立好的物件存在該集合中,當需要使用池中的物件時,再從池中取出,恰當地使用物件池可以有效減少物件生成和初始化時的消耗,提高系統的執行效率。另外,利用物件池還可以對物件的狀態做一定的維護,確保物件是可用的,提高程式的健壯性。注意:物件池技術

spring4.2.9 java專案環境下ioc原始碼分析——執行refresh之前

本系列文章講述spring IOC容器如何載入Bean與例項化Bean以及其中所穿插的一些實現。本文章以ClassPathXmlApplicationContext為起點,debug啟動流程。程式碼如下public static void main(String[] args

Spark RPC 框架原始碼分析執行時序

前情提要: Spark RPC 框架原始碼分析(一)簡述 一. Spark RPC 概述概述 上一篇我們已經說明了 Spark RPC 框架的一個簡單例子,以及一些基本概念的說明。這一篇我們主要講述其執行時序,從而揭露 Spark RPC 框架的執行原理。我們將分為兩部分,分別從服務端和客戶端

AFNetworking3.1.0原始碼分析整體框架和功能模組

簡介 1:基於系統NSURLSession類族封裝完成HPPT/HPPTS(GET,PUT,PSOT,DELEATE,HEAD)網路請求 2:擴充套件部分UIKit控制元件,比如擴充套件UIIMag

Quartz原始碼分析------ 以執行緒等待的方式實現按時間排程

Quartz是運用最廣的任務排程框架,它最核心的組成部分是Scheduler、Trigger、JobDetail,然後給Scheduler配置個執行緒QuartzSchedulerThread,此執行緒在Scheduler初始化時啟動,等待Scheduler start,然後

Apache Arrow原始碼分析——簡介和框架

背景 列儲存在資料庫領域中早已被提出,列儲存資料結構在分析型事務上表現優異,大資料分析引擎,諸如Spark-SQL,Impala 均採用列儲存作為其中間資料表示形式,那麼Apache Arrow就是這樣一種記憶體列式資料結構。 在眾多分散式系統中,每

mybatis 原始碼分析框架結構概覽

本篇部落格將主要對 mybatis 整體介紹,包括 mybatis 的專案結構,執行的主要流程,初始化流程,API 等各模組進行簡單的串聯,讓你能夠對 mybatis 有一個整體的把握。另外在 mybatis 原始碼的閱讀過程中,如果不想寫 demo 可以直接使用專案中的單元測試; 一、mybatis 結構介

Flume NG原始碼分析基於靜態properties檔案的配置模組

日誌收集是網際網路公司的一個重要服務,Flume NG是Apache的頂級專案,是分散式日誌收集服務的一個開源實現,具有良好的擴充套件性,與其他很多開源元件可以無縫整合。搜了一圈發現介紹Flume NG的文章有不少,但是深入分析Flume NG原始碼的卻沒有。準備寫一個系列分析一下Flume NG的

GCC原始碼分析——介紹與安裝

原文連結:http://blog.csdn.net/sonicling/article/details/6702031     上半年一直在做有關GCC和LD的專案,到現在還沒做完。最近幾天程式設計的那臺電腦壞了,所以趁此間隙寫一點相關的分析和

Glide原始碼分析從用法來看之with方法

繼續啃原始碼,用過Glide的人,肯定都覺得它好好用,我們一般只需要幾行程式碼,就可以達到我們想要的效果,可以在這個背後是什麼呢?就需要我們來看了。 我一般看原始碼,我喜歡先從用法來看,然後一步一步的再細扣,所以就先從用法來看Glide的整體流程。 用過Glide的人,用下面這段

zigbee 之ZStack-2.5.1a原始碼分析

先看main, 在檔案Zmain.c裡面 main osal_init_system(); osalInitTasks(); ... ... SampleApp_Init( taskID ); // 使用者定義的任務

Docker Client原始碼分析

主要內容: Docker Client在Docker中的定位,以及Docker Client原始碼的初步分析。 本文選取Docker拆分為DockerCE(社群版)和DockerEE(企業版)之後的Docker-CE的第一個穩定版本v17.06.0-ce。 https://github.com/docker

Hibernate使用原始碼分析

Hibernate使用及原始碼分析(一) 本篇文章主要通過hibernate初級使用分析一下原始碼,只是給初學者一點小小的建議,不喜勿噴,謝謝! hibernate環境搭建 簡單使用 原始碼走讀 一 hibernate環境搭建 這裡直接

SpringCloud原始碼分析--客戶端搭建

一、前言 上一節的註冊中心搭建完成了,本節開始搭建客戶端,其實對於springcloud的Eureka註冊中心而言,他本身就是服務端也是客戶端,我們上節待見服務端註冊中心的時候,已經通過配置來設定其不向自己註冊,和不去檢索服務的功能,保持了其作為服務註冊中心的相對的功能單一性。 二、pom檔案

Vue原始碼分析:入口檔案

Vue原始碼分析(一):入口檔案   首先開啟命令列,從github下載原始碼,下載到自己的工作目錄。 git clone https://github.com/vuejs/vue.git   這裡我下載的是2.5.17版本的,vue 原始碼是由各種模組用 rollup 工具

okhttp原始碼分析——基本流程超詳細

1.okhttp原始碼分析(一)——基本流程(超詳細) 2.okhttp原始碼分析(二)——RetryAndFollowUpInterceptor過濾器 3.okhttp原始碼分析(三)——CacheInterceptor過濾器 4.okhttp原始碼分析(四)——Conn

spring事務管理原始碼分析配置和事務增強代理的生成流程

在本篇文章中,將會介紹如何在spring中進行事務管理,之後對其內部原理進行分析。主要涉及 @EnableTransactionManagement註解為我們做了什麼? 為什麼標註了@Transactional註解的方法就可以具有事務的特性,保持了資料的ACID特性?spring到底是如何具有這樣