Java多線程中的Executor詳解
Java多線程中的Executor
定義了執(zhí)行已提交Runnable任務(wù)的對(duì)象。該接口提供了一種將任務(wù)提交與如何運(yùn)行每個(gè)任務(wù)的機(jī)制(包括線程使用、調(diào)度等細(xì)節(jié))解耦的方法。它通常使用預(yù)先創(chuàng)建線程而不是創(chuàng)建線程。
例如new Thread(new(RunnableTask())).start() 每次都創(chuàng)建新線程來執(zhí)行任務(wù)。
現(xiàn)在可以使用以下方式來執(zhí)行任務(wù):
Executor executor = anExecutor; executor.execute(new RunnableTask1());
然而,Executor接口并不嚴(yán)格要求異步執(zhí)行,在一個(gè)簡(jiǎn)易測(cè)試中,executor 可以在調(diào)用者的線程中立即運(yùn)行提交的任務(wù):
class DirectExecutor implements Executor {
public void execute(Runnable r) {
//直接執(zhí)行提交者任務(wù)
r.run();
}
}更典型的情況是,任務(wù)在調(diào)用者的線程之外的某個(gè)線程中執(zhí)行。下面的執(zhí)行程序?yàn)槊總€(gè)任務(wù)生成一個(gè)新線程。
class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) {
//創(chuàng)建新線程來執(zhí)行任務(wù)
new Thread(r).start();
}
}許多Executor實(shí)現(xiàn)對(duì)如何以及何時(shí)調(diào)度任務(wù)施加了某種限制。下面的執(zhí)行程序?qū)⑷蝿?wù)的提交序列化到第二個(gè)執(zhí)行程序,演示了復(fù)合執(zhí)行程序。
class SerialExecutor implements Executor {
final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
final Executor executor;
Runnable active;
SerialExecutor(Executor executor) {
this.executor = executor;
}
public synchronized void execute(final Runnable r) {
//創(chuàng)建一個(gè)任務(wù)并存放到雙端隊(duì)列
tasks.offer(new Runnable() {
public void run() {
try {
r.run();
} finally {
scheduleNext();
}
}
});
//開啟第一個(gè)任務(wù)
if (active == null) {
scheduleNext();
}
}
protected synchronized void scheduleNext() {
if ((active = tasks.poll()) != null) {
executor.execute(active);
}
}
}ExecutorService接口拓展Executor功能,這是一個(gè)更廣泛的接口。
ThreadPoolExecutor類提供可擴(kuò)展的線程池實(shí)現(xiàn)。
Executors類提供了方便的工廠方法。
內(nèi)存一致性效應(yīng):在將可運(yùn)行對(duì)象提交給執(zhí)行程序之前發(fā)生的線程操作——在它開始執(zhí)行之前,可能在另一個(gè)線程中。
到此這篇關(guān)于Java多線程中的Executor詳解的文章就介紹到這了,更多相關(guān)Java的Executor內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
http basic authentication通過post方式訪問api示例分享 basic認(rèn)證示例
在HTTP中,基本認(rèn)證是一種用來允許Web瀏覽器或其他客戶端程序在請(qǐng)求時(shí)提供以用戶名和口令形式的憑證,這篇文章主要介紹了http basic authentication通過post方式訪問api示例,大家參考使用吧2014-01-01
淺析java實(shí)現(xiàn)數(shù)據(jù)加密問題
本文通過實(shí)例代碼給大家介紹了java實(shí)現(xiàn)數(shù)據(jù)加密問題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-11-11
淺談mybatis-plus批量保存異常及效率優(yōu)化
本文主要介紹了mybatis-plus批量保存異常及效率優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
淺談SpringMVC中Interceptor和Filter區(qū)別
這篇文章主要介紹了淺談SpringMVC中Interceptor和Filter區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04
淺談一下SpringCloud中Hystrix服務(wù)熔斷和降級(jí)原理
這篇文章主要介紹了淺談一下SpringCloud中Hystrix服務(wù)熔斷和降級(jí)原理,Hystrix 是 Netflix 的一款開源的容錯(cuò)框架,通過服務(wù)隔離來避免由于依賴延遲、異常,引起資源耗盡導(dǎo)致系統(tǒng)不可用的解決方案,需要的朋友可以參考下2023-05-05

