Java中Executor和Executors的區(qū)別小結(jié)
在Java并發(fā)編程中,Executor和Executors是兩個(gè)密切相關(guān)但功能不同的類或接口,它們都與線程池管理和任務(wù)執(zhí)行相關(guān)。理解這兩者的區(qū)別對正確使用Java并發(fā)API非常重要。
1. Executor 的定義與功能
1.1 Executor 接口
Executor 是 Java 并發(fā)框架中的一個(gè)核心接口,它提供了一種將任務(wù)的提交與任務(wù)的執(zhí)行解耦的機(jī)制。換句話說,Executor接口的設(shè)計(jì)目標(biāo)是將“任務(wù)的執(zhí)行”這一行為抽象出來,使得任務(wù)的提交者不必關(guān)心任務(wù)是如何執(zhí)行的(如是否在新的線程中執(zhí)行、是否在某個(gè)線程池中執(zhí)行等)。
public interface Executor {
void execute(Runnable command);
}
execute(Runnable command) 方法:這是 Executor 接口中唯一的方法,它接受一個(gè)實(shí)現(xiàn)了 Runnable 接口的任務(wù),并安排該任務(wù)的執(zhí)行。具體如何執(zhí)行這個(gè)任務(wù),由實(shí)現(xiàn) Executor 接口的類決定。
1.2 Executor 接口的設(shè)計(jì)目的
Executor接口的主要設(shè)計(jì)目的是簡化并發(fā)任務(wù)的執(zhí)行過程,提供了一種統(tǒng)一的方式來提交任務(wù),而不需要開發(fā)者顯式地創(chuàng)建和管理線程。通過這一接口,開發(fā)者可以將任務(wù)的執(zhí)行策略(如線程池、異步執(zhí)行等)與業(yè)務(wù)邏輯分離,使得代碼更簡潔、可維護(hù)性更高。
2. Executors 的定義與功能
2.1 Executors 類
Executors 是一個(gè)實(shí)用工具類,它包含了一些靜態(tài)工廠方法,用于創(chuàng)建 Executor、ExecutorService、ScheduledExecutorService 等的常用實(shí)現(xiàn)。這些實(shí)現(xiàn)通常與線程池相關(guān),因此 Executors 類在實(shí)際開發(fā)中非常常用。
public class Executors {
// 創(chuàng)建一個(gè)單線程執(zhí)行器
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
// 創(chuàng)建一個(gè)固定線程數(shù)的線程池
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
// 創(chuàng)建一個(gè)可以根據(jù)需要擴(kuò)展的線程池
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
// 其他工廠方法...
}
2.2 Executors 類的常用方法
Executors 類提供了多種創(chuàng)建線程池的方法,每種方法返回的都是 ExecutorService 的不同實(shí)現(xiàn),這些實(shí)現(xiàn)適合不同的并發(fā)場景:
newFixedThreadPool(int nThreads):創(chuàng)建一個(gè)固定大小的線程池。這個(gè)線程池中的線程數(shù)量是固定的,無論有多少任務(wù)提交到線程池中,線程池中同時(shí)運(yùn)行的線程數(shù)量不會(huì)超過指定的大小。適用于處理穩(wěn)定數(shù)量的并發(fā)任務(wù)。newCachedThreadPool():創(chuàng)建一個(gè)可緩存的線程池。這個(gè)線程池會(huì)根據(jù)需要?jiǎng)?chuàng)建新線程,如果線程空閑超過60秒則會(huì)被回收,因此在大量短期異步任務(wù)的場景中非常有用。newSingleThreadExecutor():創(chuàng)建一個(gè)單線程執(zhí)行器。這個(gè)執(zhí)行器確保所有任務(wù)在一個(gè)線程中按順序執(zhí)行,適用于需要順序執(zhí)行任務(wù)的場景。newScheduledThreadPool(int corePoolSize):創(chuàng)建一個(gè)定時(shí)線程池。該線程池支持任務(wù)調(diào)度和周期性執(zhí)行,適用于需要定期執(zhí)行任務(wù)的場景。
3. Executor 與 Executors 的區(qū)別
3.1 接口與工具類的區(qū)別
Executor是接口:Executor是一個(gè)接口,定義了一個(gè)任務(wù)執(zhí)行的標(biāo)準(zhǔn)方法execute(Runnable command)。它提供了一個(gè)抽象層,使得任務(wù)的提交者無需關(guān)心任務(wù)是如何被執(zhí)行的。Executors是工具類:Executors是一個(gè)工具類,提供了創(chuàng)建各種Executor、ExecutorService實(shí)現(xiàn)的靜態(tài)工廠方法。它簡化了線程池的創(chuàng)建過程,使得開發(fā)者能夠方便地獲得適合自己應(yīng)用場景的線程池實(shí)現(xiàn)。
3.2 關(guān)注點(diǎn)的區(qū)別
Executor關(guān)注的是任務(wù)的執(zhí)行:Executor關(guān)注如何執(zhí)行提交的任務(wù),定義了任務(wù)執(zhí)行的標(biāo)準(zhǔn)接口。它是一種行為規(guī)范,使得不同的執(zhí)行器可以被替換而不改變代碼的行為。Executors關(guān)注的是如何創(chuàng)建Executor:Executors關(guān)注的是如何創(chuàng)建符合特定需求的線程池或任務(wù)執(zhí)行器。它提供了多種預(yù)定義的Executor和ExecutorService實(shí)現(xiàn),幫助開發(fā)者根據(jù)不同的并發(fā)需求選擇合適的執(zhí)行策略。
3.3 使用場景的區(qū)別
Executor的使用場景:Executor通常用于需要自定義任務(wù)執(zhí)行邏輯的場景,例如自定義任務(wù)調(diào)度策略、管理任務(wù)隊(duì)列等。開發(fā)者可以實(shí)現(xiàn)Executor接口,定義自己的任務(wù)執(zhí)行器。Executors的使用場景:Executors通常用于創(chuàng)建標(biāo)準(zhǔn)的線程池或執(zhí)行器,適合常見的并發(fā)任務(wù)執(zhí)行需求。通過使用Executors提供的工廠方法,開發(fā)者可以快速創(chuàng)建和使用線程池,而無需關(guān)心底層實(shí)現(xiàn)細(xì)節(jié)。
4. 實(shí)際使用中的示例
4.1 使用 Executor
假設(shè)我們有一個(gè)簡單的任務(wù)調(diào)度系統(tǒng),我們可以使用 Executor 接口來抽象任務(wù)的執(zhí)行過程:
public class SimpleExecutor implements Executor {
@Override
public void execute(Runnable command) {
new Thread(command).start();
}
}
這個(gè) SimpleExecutor 類實(shí)現(xiàn)了 Executor 接口,它在每次接收到任務(wù)時(shí)都會(huì)創(chuàng)建一個(gè)新線程來執(zhí)行任務(wù)。這種實(shí)現(xiàn)非常簡單,但在實(shí)際應(yīng)用中通常會(huì)使用更復(fù)雜的執(zhí)行器,例如線程池。
4.2 使用 Executors
通過 Executors 工具類,我們可以很方便地創(chuàng)建一個(gè)固定大小的線程池,并提交任務(wù):
public class ExecutorExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
executor.execute(new RunnableTask(i));
}
executor.shutdown();
}
}
class RunnableTask implements Runnable {
private int taskId;
public RunnableTask(int id) {
this.taskId = id;
}
@Override
public void run() {
System.out.println("Executing task " + taskId + " by " + Thread.currentThread().getName());
}
}
在這個(gè)示例中,我們使用 Executors.newFixedThreadPool(5) 創(chuàng)建了一個(gè)固定大小為5的線程池,然后提交了10個(gè)任務(wù)給線程池執(zhí)行。線程池將自動(dòng)管理這些任務(wù)的執(zhí)行,并復(fù)用線程來處理任務(wù)。
5. 總結(jié)
在Java并發(fā)編程中,Executor和Executors雖然名稱相似,但它們有著截然不同的職責(zé)和用途:
Executor是一個(gè)接口,定義了任務(wù)執(zhí)行的標(biāo)準(zhǔn)方法,它是并發(fā)編程中任務(wù)執(zhí)行的核心抽象。Executor讓任務(wù)的提交者不需要關(guān)心任務(wù)的具體執(zhí)行方式,從而實(shí)現(xiàn)任務(wù)執(zhí)行與業(yè)務(wù)邏輯的解耦。Executors是一個(gè)工具類,提供了多種工廠方法來創(chuàng)建不同類型的Executor和ExecutorService實(shí)現(xiàn)。通過使用Executors提供的工廠方法,開發(fā)者可以輕松創(chuàng)建和管理線程池,以適應(yīng)各種并發(fā)編程需求。
到此這篇關(guān)于Java中Executor和Executors的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Java Executor Executors內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring定時(shí)任務(wù)無故停止又不報(bào)錯(cuò)的解決
這篇文章主要介紹了Spring定時(shí)任務(wù)無故停止又不報(bào)錯(cuò)的解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringBoot實(shí)現(xiàn)其他普通類調(diào)用Spring管理的Service,dao等bean
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)其他普通類調(diào)用Spring管理的Service,dao等bean,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Android仿微信實(shí)現(xiàn)左滑顯示刪除按鈕功能
這篇文章主要為大家詳細(xì)介紹了java仿微信實(shí)現(xiàn)左滑顯示刪除按鈕功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
Struts1和struts2的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Struts1和struts2的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
在Java中避免NullPointerException的解決方案
這篇文章主要介紹了在Java中避免NullPointerException的解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Java編程用兩個(gè)棧實(shí)現(xiàn)隊(duì)列代碼分享
這篇文章主要介紹了Java編程用兩個(gè)棧實(shí)現(xiàn)隊(duì)列代碼分享,具有一定參考價(jià)值,這里給大家分享下,供需要的朋友了解。2017-10-10
Jmeter參數(shù)化實(shí)現(xiàn)方法及應(yīng)用實(shí)例
這篇文章主要介紹了Jmeter參數(shù)化實(shí)現(xiàn)方法及應(yīng)用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
SpringBoot整合XxlJob分布式任務(wù)調(diào)度平臺(tái)
xxl-job是一個(gè)開源的分布式定時(shí)任務(wù)框架,它可以與其他微服務(wù)組件一起構(gòu)成微服務(wù)集群。它的調(diào)度中心(xxl-job)和執(zhí)行器(自己的springboot項(xiàng)目中有@XxlJob("定時(shí)任務(wù)名稱")的方法)是相互分離,分開部署的,兩者通過HTTP協(xié)議進(jìn)行通信2023-02-02

