Java多線程中的Executor詳解
Java多線程中的Executor
定義了執(zhí)行已提交Runnable任務(wù)的對象。該接口提供了一種將任務(wù)提交與如何運行每個任務(wù)的機制(包括線程使用、調(diào)度等細節(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接口并不嚴格要求異步執(zhí)行,在一個簡易測試中,executor 可以在調(diào)用者的線程中立即運行提交的任務(wù):
class DirectExecutor implements Executor { public void execute(Runnable r) { //直接執(zhí)行提交者任務(wù) r.run(); } }
更典型的情況是,任務(wù)在調(diào)用者的線程之外的某個線程中執(zhí)行。下面的執(zhí)行程序為每個任務(wù)生成一個新線程。
class ThreadPerTaskExecutor implements Executor { public void execute(Runnable r) { //創(chuàng)建新線程來執(zhí)行任務(wù) new Thread(r).start(); } }
許多Executor實現(xiàn)對如何以及何時調(diào)度任務(wù)施加了某種限制。下面的執(zhí)行程序?qū)⑷蝿?wù)的提交序列化到第二個執(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)建一個任務(wù)并存放到雙端隊列 tasks.offer(new Runnable() { public void run() { try { r.run(); } finally { scheduleNext(); } } }); //開啟第一個任務(wù) if (active == null) { scheduleNext(); } } protected synchronized void scheduleNext() { if ((active = tasks.poll()) != null) { executor.execute(active); } } }
ExecutorService接口拓展Executor功能,這是一個更廣泛的接口。
ThreadPoolExecutor類提供可擴展的線程池實現(xiàn)。
Executors類提供了方便的工廠方法。
內(nèi)存一致性效應(yīng):在將可運行對象提交給執(zhí)行程序之前發(fā)生的線程操作——在它開始執(zhí)行之前,可能在另一個線程中。
到此這篇關(guān)于Java多線程中的Executor詳解的文章就介紹到這了,更多相關(guān)Java的Executor內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Servlet和Filter之間的區(qū)別與聯(lián)系
這篇文章主要介紹了Servlet和Filter之間的區(qū)別與聯(lián)系的相關(guān)資料,需要的朋友可以參考下2016-05-05SpringBoot如何使用Scala進行開發(fā)的實現(xiàn)
這篇文章主要介紹了SpringBoot如何使用Scala進行開發(fā)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java 實現(xiàn)簡單靜態(tài)資源Web服務(wù)器的示例
這篇文章主要介紹了Java 實現(xiàn)簡單靜態(tài)資源Web服務(wù)器的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11springboot使用jasypt對配置文件加密加密數(shù)據(jù)庫連接的操作代碼
這篇文章主要介紹了springboot使用jasypt對配置文件加密加密數(shù)據(jù)庫連接的操作代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01