欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java 中Executor, ExecutorService 和 Executors 間的不同

 更新時間:2017年06月07日 15:06:47   作者:馬蘇大馬哈魚  
這篇文章主要介紹了java 中Executor, ExecutorService 和 Executors 間的不同的相關(guān)資料,需要的朋友可以參考下

java 中Executor, ExecutorService 和 Executors 間的不同

java.util.concurrent.Executor, java.util.concurrent.ExecutorService, java.util.concurrent. Executors 這三者均是 Java Executor 框架的一部分,用來提供線程池的功能。因為創(chuàng)建和管理線程非常心累,并且操作系統(tǒng)通常對線程數(shù)有限制,所以建議使用線程池來并發(fā)執(zhí)行任務(wù),而不是每次請求進來時創(chuàng)建一個線程。使用線程池不僅可以提高應(yīng)用的響應(yīng)時間,還可以避免”java.lang.OutOfMemoryError: unable to create new native thread” 之類的錯誤。

在 Java 1.5 時,開發(fā)者需要關(guān)心線程池的創(chuàng)建和管理,但在 Java 1.5 之后 Executor 框架提供了多種內(nèi)置的線程池,例如:FixedThreadPool(包含固定數(shù)目的線程),CachedThreadPool(可根據(jù)需要創(chuàng)建新的線程)等等。

Executor

Executor, ExecutorService, 和 Executors 最主要的區(qū)別是 Executor 是一個抽象層面的核心接口(大致代碼如下)。

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

不同于 java.lang.Thread 類將任務(wù)和執(zhí)行耦合在一起, Executor 將任務(wù)本身和執(zhí)行任務(wù)分離,可以閱讀 difference between Thread and Executor 來了解 Thread 和 Executor 間更多的不同。

ExecutorService

ExecutorService 接口 對 Executor 接口進行了擴展,提供了返回 Future 對象,終止,關(guān)閉線程池等方法。當調(diào)用 shutDown 方法時,線程池會停止接受新的任務(wù),但會完成正在 pending 中的任務(wù)。

Future 對象提供了異步執(zhí)行,這意味著無需等待任務(wù)執(zhí)行的完成,只要提交需要執(zhí)行的任務(wù),然后在需要時檢查 Future 是否已經(jīng)有了結(jié)果,如果任務(wù)已經(jīng)執(zhí)行完成,就可以通過 Future.get() 方法獲得執(zhí)行結(jié)果。需要注意的是,F(xiàn)uture.get() 方法是一個阻塞式的方法,如果調(diào)用時任務(wù)還沒有完成,會等待直到任務(wù)執(zhí)行結(jié)束。

通過 ExecutorService.submit() 方法返回的 Future 對象,還可以取消任務(wù)的執(zhí)行。Future 提供了 cancel() 方法用來取消執(zhí)行 pending 中的任務(wù)。

ExecutorService 部分代碼如下:

public interface ExecutorService extends Executor {
 void shutdown();
 <T> Future<T> submit(Callable<T> task);
 <T> Future<T> submit(Runnable task, T result);
 <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException;
}

Executors

Executors 是一個工具類,類似于 Collections。提供工廠方法來創(chuàng)建不同類型的線程池,比如 FixedThreadPool 或 CachedThreadPool。

Executors 部分代碼:

public class Executors {
 public static ExecutorService newFixedThreadPool(int nThreads) {
  return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
  }
   
  public static ExecutorService newCachedThreadPool() {
  return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
  }
}

下面詳細看一下三者的區(qū)別:

Executor vs ExecutorService vs Executors

正如上面所說,這三者均是 Executor 框架中的一部分。Java 開發(fā)者很有必要學(xué)習(xí)和理解他們,以便更高效的使用 Java 提供的不同類型的線程池??偨Y(jié)一下這三者間的區(qū)別,以便大家更好的理解:

·         Executor 和 ExecutorService 這兩個接口主要的區(qū)別是:ExecutorService 接口繼承了 Executor 接口,是 Executor 的子接口

·         Executor 和 ExecutorService 第二個區(qū)別是:Executor 接口定義了 execute()方法用來接收一個Runnable接口的對象,而 ExecutorService 接口中的 submit()方法可以接受Runnable和Callable接口的對象。

·         Executor 和 ExecutorService 接口第三個區(qū)別是 Executor 中的 execute() 方法不返回任何結(jié)果,而 ExecutorService 中的 submit()方法可以通過一個 Future 對象返回運算結(jié)果。

·         Executor 和 ExecutorService 接口第四個區(qū)別是除了允許客戶端提交一個任務(wù),ExecutorService 還提供用來控制線程池的方法。比如:調(diào)用 shutDown() 方法終止線程池??梢酝ㄟ^ 《Java Concurrency in Practice》 一書了解更多關(guān)于關(guān)閉線程池和如何處理 pending 的任務(wù)的知識。

·         Executors 類提供工廠方法用來創(chuàng)建不同類型的線程池。比如: newSingleThreadExecutor() 創(chuàng)建一個只有一個線程的線程池,newFixedThreadPool(int numOfThreads)來創(chuàng)建固定線程數(shù)的線程池,newCachedThreadPool()可以根據(jù)需要創(chuàng)建新的線程,但如果已有線程是空閑的會重用已有線程。

總結(jié)

下表列出了 Executor 和 ExecutorService 的區(qū)別:

相關(guān)文章

  • 詳解spring 配置的兩種方式:JAVA配置和注解配置

    詳解spring 配置的兩種方式:JAVA配置和注解配置

    這篇文章主要介紹了詳解spring 配置的兩種方式:JAVA配置和注解配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Spring Boot實現(xiàn)Undertow服務(wù)器同時支持HTTP2、HTTPS的方法

    Spring Boot實現(xiàn)Undertow服務(wù)器同時支持HTTP2、HTTPS的方法

    這篇文章考慮如何讓Spring Boot應(yīng)用程序同時支持HTTP和HTTPS兩種協(xié)議。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java LinkedList源碼深入分析

    Java LinkedList源碼深入分析

    鏈表(Linkedlist)是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會按線性的順序存儲數(shù)據(jù),而是在每一個節(jié)點里存到下一個節(jié)點的地址。鏈表可分為單向鏈表和雙向鏈表
    2022-08-08
  • mybatis動態(tài)新增(insert)和修改(update)方式

    mybatis動態(tài)新增(insert)和修改(update)方式

    這篇文章主要介紹了mybatis動態(tài)新增(insert)和修改(update)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java虛擬機棧jvm棧的作用

    Java虛擬機棧jvm棧的作用

    本文主要介紹了Java虛擬機棧jvm棧的作用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 如何使用Java將word解析出來(包含格式和圖片)

    如何使用Java將word解析出來(包含格式和圖片)

    今天遇到一個讀取word模板內(nèi)容的需求,下面這篇文章主要給大家介紹了關(guān)于如何使用Java將word解析出來,包含格式和圖片,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • SpringBoot實現(xiàn)圖片防盜鏈功能

    SpringBoot實現(xiàn)圖片防盜鏈功能

    出于安全考慮,我們需要后端返回的圖片只允許在某個網(wǎng)站內(nèi)展示,不想被爬蟲拿到圖片地址后被下載,或者,不想瀏覽器直接訪問圖片鏈接,所以本文將給大家介紹SpringBoot實現(xiàn)圖片防盜鏈功能,需要的朋友可以參考下
    2024-04-04
  • Java中的CyclicBarrier同步屏障詳解

    Java中的CyclicBarrier同步屏障詳解

    這篇文章主要介紹了Java中的CyclicBarrier同步屏障詳解,CyclicBarrier也叫同步屏障,在JDK1.5被引入,可以讓一組線程達到一個屏障時被阻塞,直到最后一個線程達到屏障時,屏障才會開門,所有被阻塞的線程才會繼續(xù)執(zhí)行,需要的朋友可以參考下
    2023-09-09
  • Eclipse+Maven構(gòu)建Hadoop項目的方法步驟

    Eclipse+Maven構(gòu)建Hadoop項目的方法步驟

    這篇文章主要介紹了Eclipse+Maven構(gòu)建Hadoop項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • java多線程批量拆分List導(dǎo)入數(shù)據(jù)庫的實現(xiàn)過程

    java多線程批量拆分List導(dǎo)入數(shù)據(jù)庫的實現(xiàn)過程

    這篇文章主要給大家介紹了關(guān)于java多線程批量拆分List導(dǎo)入數(shù)據(jù)庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-10-10

最新評論