1. 程式人生 > >Executor框架和執行緒池

Executor框架和執行緒池

在JDK5後主要提供的多執行緒處理都在java.util.concurrent包中,多執行緒的主要抽象不是Thread,而是Executor,Executor為介面,定義在java.util.concurrent包下,只定義了一個方法:

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

它提供了一種標準的方法將任務的提交和過程和執行過程解耦,並用Runnable來表示任務,Executor的實現還提供了對生命週期的支援,以及統計資訊收集、應用程式管理機制和效能監視機制。Executor基於生產者——消費者模式,提交任務的過程就相當於是生產者,生成待完成的工作單元,執行任務的過程相當於消費者,執行完這些工作單元。如果在程式中實現一個生產者——消費者的設計,那麼最簡單的方法就使用Executor。每當看到下面這種形式的程式碼:new Thread(runnable).start(),最好考慮使用Executor來代替更加靈活。

執行緒池

執行緒池指管理一組同構工作執行緒的資源池,執行緒池是與工作佇列密切相關的,在工作佇列中儲存了所有等待執行的任務,工作者執行緒的任務很簡單:從工作佇列中獲取一個任務,執行任務,然後返回執行緒池並等待下一個任務。“線上程池中執行任務”比“為每個任務分配一個執行緒”有更大優勢,通過重用現有執行緒,而不是建立新執行緒,可以在處理多個請求時分攤線上程建立和銷燬過程中產生的巨大的開銷,另外,當請求到達時,工作執行緒已經存在,因此不會由於等待建立執行緒而延遲任務的執行,從而提高響應性,通過調整執行緒池的大小,可以建立足夠多的執行緒以便使處理器保持忙碌的狀態,同時還可以防止過多的執行緒相互競爭資源而應用程式耗盡記憶體。

無限制建立執行緒的不足

1、執行緒生命週期的開銷非常高。執行緒的建立也銷燬並不是沒有代價的,根據平臺的不同實際開銷也不同,但執行緒的建立過程都需要時間,延遲請求的處理,並且需要JVM和作業系統提供一些輔助操作。
2、資源消耗。活躍的執行緒會消耗系統資源,特別是記憶體,如果可以執行的執行緒數量多於可用的處理器數量,那麼有些執行緒就會閒置,大量的閒置執行緒就會佔用很多的記憶體,如果你已經有足夠多的執行緒使處理器保持忙碌狀態,那麼建立更多的執行緒反而會降低效能。
3、穩定性。在可建立執行緒的數量上存在一個限制,不同平臺不同,而且受多個因素制約,包括JVM啟動引數、Thread建構函式中請求的棧大小,以及底層作業系統對執行緒的限制等,如果破壞了這些限制將丟擲OutOfMemoryError異常。

Executor的生命週期

為了解決執行服務的生命週期問題,ExecutorService擴充套件了Executor介面,添加了一些用於生命週期的管理方法,下面程式碼為ExecutorService介面的定義:

public interface ExecutorService extends Executor {  
    void shutdown();  
    List<Runnable> shutdownNow();  
    boolean isShutdown();  
    boolean isTerminated();  
    boolean awaitTermination(long timeout, TimeUnit unit)  
        throws InterruptedException;  
    ......  
}  

ExecutorService有三種狀態:執行、關閉、終止,ExecutorService在初建時屬於執行狀態,shutdown方法將執行平緩的關閉過程:不再接受新的任務,同時等待已經提交的任務執行完成,包括那些還未開始執行的任務。shotdownNow()方法將粗暴的關閉過程:它將嘗試取消所有執行中的任務,並且不再啟動佇列中尚未開始執行的任務。

相關推薦

Java的Executor框架執行實現原理

一,Java的Executor框架 1,Executor介面 public interface Executor {     void execute(Runnable command); } Executor介面是Executor框架中最基礎的部分,定義了一個用於

Executor框架執行

在JDK5後主要提供的多執行緒處理都在java.util.concurrent包中,多執行緒的主要抽象不是Thread,而是Executor,Executor為介面,定義在java.util.concurrent包下,只定義了一個方法: public in

併發新特性—Executor 框架執行

蘭亭風雨 · 更新於 2018-11-14 09:00:31 併發新特性—Executor 框架與執行緒池 Executor 框架簡介 在 Java 5 之後,併發程式設計引入了一堆新的啟動、排程和管理執行緒的API。Executor 框架便是 Java 5 中引入的,其內部使用了執行緒池機

JAVA Executor框架建立執行

為了更好的控制多執行緒,JDK提供理論一套執行緒框架Executor,幫助開發人員有效的進行執行緒控制。它們都在java.util.concurrent包中,是JDK併發包的核心。其中有一個比較重要的類:Executors,他扮演著執行緒工廠的角色,我們通過Executors可以建立特定功能的執行緒

【JVM第九篇】:Executor框架執行

Executor框架簡介 在Java 5之後,併發程式設計引入了一堆新的啟動、排程和管理執行緒的API。Executor框架便是Java 5中引入的,其內部使用了執行緒池機制,它在java.util.cocurrent 包下,通過該框架來控制執行緒的啟動、執行和關閉,可以簡化併發程式設計

java執行Executor框架執行

執行緒雖然在web開發中用的不算特別多,但在特定的情況下還是能發揮重要重要作用的,因此即使用的少還是掌握下比較好;下面先回顧下比較執行緒的常規實現方法 1 繼承Thread類 2 實現runnable介面(使用較多) java5之後有了新的執行緒實現方式,java5可以使用

Java併發(基礎知識)—— Executor框架執行

在Java併發(基礎知識)—— 建立、執行以及停止一個執行緒中講解了兩種建立執行緒的方式:直接繼承Thread類以及實現Runnable介面並賦給Thread,這兩種建立執行緒的方式線上程比較少的時候是沒有問題的,但是當需要建立大量執行緒時就會出現問題,因為

併發新特性—Executor框架執行(含程式碼)

Executor框架簡介 在Java 5之後,併發程式設計引入了一堆新的啟動、排程和管理執行緒的API。Executor框架便是Java 5中引入的,其內部使用了執行緒池機制,它在java.util.cocurrent 包下,通過該框架來控制執行緒的啟動、執行

Java 並發編程——Executor框架線程原理

ignore 程序管理 on() explicit 開發 抽象類 bool i++ RR Eexecutor作為靈活且強大的異步執行框架,其支持多種不同類型的任務執行策略,提供了一種標準的方法將任務的提交過程和執行過程解耦開發,基於生產者-消費者模式,其提交任務的線程相當於

用程序執行實現高併發伺服器

思想:   1.  建立與伺服器相同cpu個數的程序個數來監聽(accept)客戶端響應,並在每個程序中先建立好一個執行緒池   2.  有客戶端訪問時,解除其中一個程序的accpet阻塞,進入到執行緒中來執行接收資料工作( recv() ),用執行緒防止recv阻塞,執行緒呼叫recv方法   3. 

執行篇---Task(任務)執行不得不說的祕密

整理自部落格園一大佬的文章 :https://www.cnblogs.com/tuyile006/p/7154924.html 和碼農之家一匿名大佬 https://www.e-learn.cn/content/net/1114080 和部落格園大佬 https://www.cnblogs.

Java——多執行基本使用(四) 執行執行的使用,工廠設計模式的使用

1.執行緒組的概述和使用 Java中使用ThreadGroup來表示執行緒組,它可以對一批執行緒進行分類管理,Java允許程式直接對執行緒組進行控制。            &n

詳解Tomcat連線數執行

轉載至http://www.importnew.com/27309.html 前言 在使用tomcat時,經常會遇到連線數、執行緒數之類的配置問題,要真正理解這些概念,必須先了解Tomcat的聯結器(Connector)。 在前面的文章 詳解Tomcat配置檔案server.xml 中寫

10.執行執行的區別,執行有哪些,什麼情況下使用

一:執行緒和執行緒池的區別 (1)new Thread 的弊端       a. 每次new Thread時,新建物件效能差。       b. 執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭,可能佔用過多系統資源導致宕機或oom。       c. 缺乏更多功能

《Android開發藝術探索》學習筆記之Android的執行執行

一、概述 1、主執行緒與子執行緒 主執行緒 又叫UI執行緒 主要作用是執行四大元件以及處理它們和使用者的互動,主要用來處理和介面相關的事情 子執行緒 執行耗時任務,比如網路請求、I/O操作等

Okhttp——佇列執行

這是很簡單的,但是假如面試官問你,你知道咋回答不? 對於同步: 開始的時候放到同步佇列,結束的時候從同步佇列中取出; 對於非同步: 開始的時候判斷非同步佇列元素數是否大於64?再遍歷一遍,看看和這個AsyncCall相同的host有沒有超過5個? 如果沒有,扔進非同

《Android 開發藝術探索》 第11章 --- android 執行執行

如果程序中沒有四大元件,其優先順序將會降低,intentservice 是service封裝了handerthread ,這是intentservice的優點 執行緒是作業系統的最小排程單元,是系統的一種受限制的系統資源,建立和銷燬執行緒都將有對應的開銷,所以使用執行緒池來避免這種開銷 Andr

Java 使用new Thread執行的區別

本文轉至:https://www.cnblogs.com/cnmenglang/p/6273761.html , 孟凡柱的專欄 的部落格,在此謝謝博主! 1.new Thread的弊端執行一個非同步任務你還只是如下new Thread嗎 new Thread(new Runnable() {

tomcat高併發下優化詳解及連線數執行

高併發環境下,我知道優化配置tomcat,對連線數和執行緒池作修改,最重要的是connector的協議Http Connector使用NIO,而不是預設的AJP Connector,當時也沒有仔細研究其原理。現在來為以上這些設定做一下剖析。 要了解這些,不能避開tomcat

asyncawait、Task執行執行的關係

計算機進入多核時代,開發人員想要充分利用計算機核心,需要編寫多執行緒程式。執行緒屬於程序,理想狀態下,在4核的計算機上最好有4個執行緒。 早期的執行緒建立是利用 Thread類,執行緒的建立需要花費很多時間,基於此,微軟公司為開發人員建立了執行緒池,執行緒池具有智慧爬山演算法,可以 根據執行