搜尋
首頁Javajava教程Java中Executor服務概述

Overview of Executor Service in Java

Executor 和 ExecutorService API 是管理和控制執行緒執行的重要工具。它們是 java.util.concurrent 套件的一部分。它們透過抽象線程創建、管理和同步的複雜性來簡化並發編程的過程。

Executors 是 java.util.concurrent 套件中的實用工具類,提供用於建立和管理不同類型的 ExecutorService 實例的工廠方法。它簡化了建立執行緒池的過程,讓我們可以輕鬆地建立和管理不同配置的執行器實例。

Executor API 它是從 Java 1.5 開始提供的介面。它提供了execute(Runnable command)方法。 這是基本接口,ExecutorService 擴展了該接口。給定的命令將在將來由新線程或線程池中的線程或同一線程執行,並且不會返回 void。

ExecutorService API 它是從 Java 1.5 開始提供的介面。它提供了多種方法來控制並發程式設計中任務的執行。它支援可運行和可調用任務。它傳回任務狀態的 Future。以下是最常用的方法。

  • submit() 接受 Callable 或 Runnable 任務並傳回 Future 型態結果。

  • invokeAny() 接受一組要執行的任務,並傳回任何一個任務成功執行的結果。

  • invokeAll() 接受要執行的任務集合,並以 Future 物件類型清單的形式傳回所有任務的結果。

  • shutdown() 不會立即停止執行器服務,但不接受新任務。一旦所有目前正在運行的任務完成,它就會關閉執行器服務。

  • shutdownNow() 會嘗試立即停止執行器服務,但不保證所有正在執行的任務會同時停止。

  • awaitTermination(long timeout, TimeUnit unit) 阻塞/等待,直到所有任務完成或發生超時或當前線程被中斷,以先發生者為準。當前線程將被阻塞。

ExecutorService 的類型

  • FixThreadPool 它會建立具有指定執行緒數的固定大小執行緒池。提交的任務是並發執行的。如果沒有任務,則執行緒將處於空閒狀態,直到任務到達。如果線程繁忙,任務將被加入到佇列中。
ExecutorService fixedThreadPool = Executors.newScheduledThreadPool(5);
Future<string> submit = fixedThreadPool.submit(() -> {
    System.out.println("Task executed by " + Thread.currentThread().getName());
    return Thread.currentThread().getName();
});
fixedThreadPool.shutdown();
</string>
  • CachedThreadPool 建立執行緒池並根據工作負載自動調整池中所需的執行緒數。如果執行緒空閒超過60秒,就會被終止。這對於動態負載非常有效。由於線程將在空閒超時後被殺死,因此這裡可以更好地利用資源。
ExecutorService fixedThreadPool = Executors.newCachedThreadPool();
Future<string> submit = fixedThreadPool.submit(() -> {
    System.out.println("Task executed by " + Thread.currentThread().getName());
    return Thread.currentThread().getName();
});
fixedThreadPool.shutdown();
</string>
  • SingleThreadExecutor 建立單線程,任務依序執行。這裡沒有並行處理。
ExecutorService fixedThreadPool = Executors.newSingleThreadExecutor();
Future<string> submit = fixedThreadPool.submit(() -> {
    System.out.println("Task executed by " + Thread.currentThread().getName());
    return Thread.currentThread().getName();
});
fixedThreadPool.shutdown()
</string>
  • ScheduledThreadPool/ScheduledExecutor 它會建立一個線程或 trhead 池,能夠定期運行任務或在一定延遲後運行。
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); // Single-threaded scheduler
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5); // Multi-threaded scheduler
scheduler.schedule(task, 10, TimeUnit.SECONDS); // Schedule task to run after 10 seconds.

scheduler.scheduleAtFixedRate(task, 5, 10, TimeUnit.SECONDS);
    //It schedules a task to run every 10 seconds with an initial delay of 5 seconds.
scheduler.scheduleWithFixedDelay(task, 5, 10, TimeUnit.SECONDS);
   //It schedules a task to run with a fixed delay of 10 seconds between the end of one execution and the start of the next, with an initial delay of 5 seconds.
scheduler.schedule(() -> scheduler.shutdown(), 20, TimeUnit.SECONDS);
   //It schedules a shutdown of the scheduler after 20 seconds to stop the example.

向 ExecutorService 提交任務
可以使用execute() 和submit() 方法將任務提交給ExecutorService。 execute()方法用於Runnable任務,而submit()可以處理Runnable和Callable任務。 ”

 executor.execute(new RunnableTask()); //fire-and-forgot
 executor.submit(new CallableTask()); //returns the status of task

關閉 ExecutorService
關閉 ExecutorService 以釋放資源非常重要。您可以使用 shutdown() 和 shutdownNow() 方法來執行此操作。

executor.shutdown(); // Initiates an orderly shutdown"
executor.shutdownNow(); // Attempts to stop all actively executing tasks.
executor.awaitTermination(long timeout, TimeUnit unit); //blocks the thread until all tasks are completed or timeout occurs or current thread is interrupted, whichever happens first. Returns `true `is tasks completed, otherwise `false`.

建議的關閉方法

executor.shutdown();
try {
    // Wait for tasks to complete or timeout
    if (!executor.awaitTermination(120, TimeUnit.SECONDS)) {
        // If the timeout occurs, force shutdown
        executor.shutdownNow();      
    }
} catch (InterruptedException ex) {
    executor.shutdownNow();
    Thread.currentThread().interrupt();
}

關於 Runnable

  • Runnable 是一個接口,代表一個可以透過執行緒運行的任務。
  • 我們可以使用Threads或Executor服務來執行Runnable任務。
  • Runnable 有 run() 方法,且不傳回任何資料。
  • 我們不能拋出已檢查的異常。

關於 Callable

  • 1.5中引入
  • 它有 call() 方法並傳回型別 V。
  • 它包含 throws Exception 的意思,我們可以拋出檢查異常。

關於未來

  • 它代表任何任務的未來結果。
  • 請求處理完成後,結果最終會在Future中出現。
  • boolean isDone() 傳回請求處理的狀態。如果完成則為 true,否則為 false。
  • boolean cancel(boolean mayInterruptIfRunning) 取消提交的任務。如果我們將 mayInterruptIfRunning 傳遞為 false,那麼它不會取消已經啟動的任務。
  • boolean isCancelled() 傳回任務是否取消。
  • V get() 傳回任務結果。如果任務未完成,則阻塞執行緒。
  • V get(long timeout, TimeUnit unit) 如有必要,最多等待給定時間以完成計算,然後檢索其結果。如果計算未完成,將在指定時間後拋出 TimeoutException。

快樂編碼和學習! ! !

如有任何問題請留言。

以上是Java中Executor服務概述的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Java平台是否獨立,如果如何?Java平台是否獨立,如果如何?May 09, 2025 am 12:11 AM

Java是平台獨立的,因為其"一次編寫,到處運行"的設計理念,依賴於Java虛擬機(JVM)和字節碼。 1)Java代碼編譯成字節碼,由JVM解釋或即時編譯在本地運行。 2)需要注意庫依賴、性能差異和環境配置。 3)使用標準庫、跨平台測試和版本管理是確保平台獨立性的最佳實踐。

關於Java平台獨立性的真相:真的那麼簡單嗎?關於Java平台獨立性的真相:真的那麼簡單嗎?May 09, 2025 am 12:10 AM

Java'splatFormIndenceIsnotsimple; itinvolvesComplexities.1)jvmcompatiblemustbebeeniblemustbeensuredacrossplatforms.2)Nativelibrariesandsystemcallsneedcarefulhandling.3)

Java平台獨立性:Web應用程序的優勢Java平台獨立性:Web應用程序的優勢May 09, 2025 am 12:08 AM

Java'splatformindependencebenefitswebapplicationsbyallowingcodetorunonanysystemwithaJVM,simplifyingdeploymentandscaling.Itenables:1)easydeploymentacrossdifferentservers,2)seamlessscalingacrosscloudplatforms,and3)consistentdevelopmenttodeploymentproce

JVM解釋:Java虛擬機的綜合指南JVM解釋:Java虛擬機的綜合指南May 09, 2025 am 12:04 AM

thejvmistheruntimeenvorment forexecutingjavabytecode,Cocucialforjava的“ WriteOnce,RunanyWhere”能力

Java的主要功能:為什麼它仍然是頂級編程語言Java的主要功能:為什麼它仍然是頂級編程語言May 09, 2025 am 12:04 AM

JavaremainsatopchoicefordevelopersduetoitsplatFormentence,對象與方向設計,強度,自動化的MememoryManagement和ComprechensivestAndArdArdArdLibrary

Java平台獨立性:這對開發人員意味著什麼?Java平台獨立性:這對開發人員意味著什麼?May 08, 2025 am 12:27 AM

Java'splatFormIndependecemeansDeveloperScanWriteCeandeCeandOnanyDeviceWithouTrecompOlding.thisAcachivedThroughThroughTheroughThejavavirtualmachine(JVM),WhaterslatesbyTecodeDecodeOdeIntComenthendions,允許univerniverSaliversalComplatibilityAcrossplatss.allospplats.s.howevss.howev

如何為第一次使用設置JVM?如何為第一次使用設置JVM?May 08, 2025 am 12:21 AM

要設置JVM,需按以下步驟進行:1)下載並安裝JDK,2)設置環境變量,3)驗證安裝,4)設置IDE,5)測試運行程序。設置JVM不僅僅是讓其工作,還包括優化內存分配、垃圾收集、性能調優和錯誤處理,以確保最佳運行效果。

如何查看產品的Java平台獨立性?如何查看產品的Java平台獨立性?May 08, 2025 am 12:12 AM

toensurejavaplatFormIntence,lofterTheSeSteps:1)compileAndRunyOpplicationOnmultPlatFormSusiseDifferenToSandjvmversions.2)upureizeci/cdppipipelinelikeinkinslikejenkinsorgithikejenkinsorgithikejenkinsorgithikejenkinsorgithike forautomatecross-plateftestesteftestesting.3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具