摘要:線程的啟動與銷毀都與本地線程同步。操作系統會調度所有線程并將它們分配給可用的??蚣艿某蓡T主要成員線程池接口接口接口以及工具類。創建單個線程的接口與其實現類用于表示異步計算的結果。參考書籍并發編程的藝術方騰飛魏鵬程曉明著
1. Executor 框架簡介 1.1 Executor 框架的兩級調度模型在java中,直接使用線程來異步的執行任務,線程的每次創建與銷毀需要一定的計算機資源開銷。每個任務創建一個線程的話,當任務數量多的時候,則對應的創建銷毀開銷會消耗大量的資源,這種策略最終可能會使處于高負荷狀態的應用崩潰。
Java中的線程,即使工作單元,也是執行機制。從JDK5開始,把工作單元與執行機制分離開來。
工作單元:Runnable 和 Callable
執行機制:Executor 框架
在HotSpot VM 的線程模型中,Java線程(java.lang.Thread) 被一對一的映射為本地操作系統的線程。Java線程的啟動與銷毀都與本地線程同步。操作系統會調度所有線程并將它們分配給可用的CPU。
在上層,Java使用多線程的程序,通常會將應用分解為若干任務,然后使用用戶級別的調度器(Executor框架)將這些任務映射為對應數量的線程;
底層,操作系統會將這些線程映射到硬件處理器上,切下層硬件的調度并不受應用程序的控制。調度模型如下圖
1.2 Executor框架的結構與成員 1. Excutor 框架的結構 -主要由3大部分組成
任務
Runnable接口(無返回值)
Callable
任務的執行
執行機制的核心接口-Executor,以及實現Executor接口的ExecutorService,
Executor框架 中有兩個關鍵類實現了ExecutorService:
ThreadPoolExecutor
線程池的實現類,執行被提交的線程、任務(Callable/Runnable 接口的實現類中的run()方法)
ScheduledThreadPoolExecutor
給定延遲或定期的執行任務(Callable/Runnable 接口的實現類中的run()方法)、命令。比Timer 更加靈活,強大。
異步執行的結果(返回值)
Future 接口 可以通過get()方法或者異步執行的結果
FutureTask
主線程(main線程)創建實現Runnable或者Callable
Executors可以將Runnable封裝為Callable
Runnable接口對象可以交由ExexutorService執行 {ExecutorService.executor(Runnable r) {無返回值};或者把Runnable接口對象或Callable
最后,主線程(main線程)執行 FutrueTask.get()阻塞,等待任務執行完成,同時獲取返回值。也可以執行FutureTask.cancel(boolean mayInterruptIfRunning)取消執行(參數表示如果正在執行是否取消)。
2. Executor框架的成員主要成員: ThreadPoolExecutor(線程池)、ScheduldThreadPoolExecutor、Runnable接口、Future接口、Callable 接口 以及 Executors工具類。
ThreadPoolExecutor
通常使用Executors 創建,Executors可以創建三種類型的ThreadPoolExecutor:SingleThreadExecuto、FixedThreadPool、CachedThreadPool
FixedThreadPool 創建固定線程數,適用于限制當前線程數量時,適用于負載較重的服務器。
Executor創建使用的API:
public static ExecutorService newFixedThreadPool(int nThreads); public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory);
SingleThreadExecutor 創建單個線程,任意時間點不會有多個線程是活動的,適用于需要保證順序執行各任務的時候。
Executors創建API:
public static ExecutorService newSingleThreadPool(); public static ExecutorService newSingleThreadPool(ThreadFactory threadFactory);
CachedThreadPool 根據需要創建新線程,大小無界的線程池,適用于執行大量短期的異步任務時,或負載較輕的服務器。
Executors創建API:
public static ExecutorService newCachedThreadPool(); public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory);
ScheduledThreadPoolExecutor
使用Executors工廠類創建,Executors可以創建兩種類型的ScheduldThreadPoolExecutor
ScheduledThreadPoolExecutor 包含若干個線程,適用于多個線程執行周期任務,同時限制執行的線程數量。
Executors 創建固定個數線程ScheduledThreadPoolExecutor 的API:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize); public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory);
SingleThreadScheduledExecutor 之包含一個線程,適用于單個后臺線程執行定時任務,同時保證順序執行各個任務。
Executors 創建單個線程SingleScheduledExecutor 的API:
public static ScheduledExecutorService newSingleScheduledExecutor(int corePoolSize); public static ScheduledExecutorService newSingleScheduledExecutor(int corePoolSize, ThreadFactory threadFactory);
Future 接口
與其實現類FutureTask用于表示異步計算的結果。Runnable/Callable接口提交(submit)給ThreadPoolExecutor或者ScheduledThreadPoolExecutor時候,返回值為FutureTask對象、實現類Future接口的對象。
Future submit(Callable task); Future submit(Runnable task, T result); Future> submit(Runnable task);
Runnable 和Callable 接口
都可以被線程池執行,Runnable 無返回值,Callable 有返回值。
Runnable可以使用工廠類Executors將其封裝為Callble
Executors 對應API如下:
//將返回的Callable對象提交給線程池返回FutureTask對象,調用FutureTask.get(),返回null public static Callable參考書籍
《Java并發編程的藝術》 -方騰飛 魏鵬 程曉明 著
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74446.html
摘要:一使用線程池的好處線程池提供了一種限制和管理資源包括執行一個任務。每個線程池還維護一些基本統計信息,例如已完成任務的數量。通過重復利用已創建的線程降低線程創建和銷毀造成的消耗。使用無界隊列作為線程池的工作隊列會對線程池帶來的影響與相同。 歷史優質文章推薦: Java并發編程指南專欄 分布式系統的經典基礎理論 可能是最漂亮的Spring事務管理詳解 面試中關于Java虛擬機(jvm)的問...
摘要:有三種狀態運行關閉終止。類類,提供了一系列工廠方法用于創建線程池,返回的線程池都實現了接口。線程池的大小一旦達到最大值就會保持不變,在提交新任務,任務將會進入等待隊列中等待。此線程池支持定時以及周期性執行任務的需求。 這是java高并發系列第19篇文章。 本文主要內容 介紹Executor框架相關內容 介紹Executor 介紹ExecutorService 介紹線程池ThreadP...
摘要:內部類,用于對和異常進行包裝,從而保證對進行只有一次成功。是取消異常,轉換后拋出。判斷是否使用的線程池,在中持有該線程池的引用。 前言 近期作者對響應式編程越發感興趣,在內部分享JAVA9-12新特性過程中,有兩處特性讓作者深感興趣:1.JAVA9中的JEP266對并發編程工具的更新,包含發布訂閱框架Flow和CompletableFuture加強,其中發布訂閱框架以java.base...
摘要:示例執行一批任務,然后消費執行結果代碼如下跟著阿里學并發,微信公眾號輸出代碼中傳入了一批任務進行處理,最終將所有處理完成的按任務完成的先后順序傳遞給進行消費了。 這是java高并發系列第20篇文章。 本文內容 ExecutorCompletionService出現的背景 介紹CompletionService接口及常用的方法 介紹ExecutorCompletionService類及...
摘要:端引導類線程管理組線程管理組將設置到服務端引導類中指定通道類型為,一種異步模式,阻塞模式為設置讓服務器監聽某個端口已等待客戶端連接。 原理剖析(第 010 篇)Netty之服務端啟動工作原理分析(上) - 一、大致介紹 1、Netty這個詞,對于熟悉并發的童鞋一點都不陌生,它是一個異步事件驅動型的網絡通信框架; 2、使用Netty不需要我們關注過多NIO的API操作,簡簡單單的使用即可...
閱讀 2812·2021-11-24 09:39
閱讀 3381·2021-11-19 09:40
閱讀 2252·2021-11-17 09:33
閱讀 3743·2021-10-08 10:04
閱讀 3035·2021-09-26 09:55
閱讀 1655·2021-09-22 15:26
閱讀 918·2021-09-10 10:51
閱讀 3115·2019-08-30 15:44