我正在學習多執行緒,我遇到了這個 SO 帖子。
Executor只是執行我們給它的東西。
ExecutorService添加了啟動、關閉以及等待和查看我們已提交以在 Executor 之上執行的作業狀態的能力(它擴展了它)。
我仍然試圖圍繞 Executor 和 ExecutorService 的使用進行思考。
- 什么時候我會使用 Executor 而不是 ExecutorService 的場景?我可以在任何地方使用 ExecutorService 嗎?
- 有沒有辦法
shutdown為 Executor 的執行添加顯式,或者它的一般做法是什么?
我使用的以下代碼Executor不會終止。這是使用 Executor 的正確方法還是我在這里遺漏了什么?如何正確終止代碼?我知道 Executor 沒有shutdown. 那么這個程式是否應該不會終止?
import java.util.concurrent.*;
public class A {
public static void main(String[] args) {
Executor executor = Executors.newFixedThreadPool(3);
executor.execute(() ->
System.out.println("Executor Class: "
Thread.currentThread().getId() ", Name: "
Thread.currentThread().getName()));
}
}
如果我將上述內容替換為ExecutorService并添加一個shutdown,程式將正常終止。
import java.util.concurrent.*;
public class A {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(() ->
System.out.println("ExecutorService Class: "
Thread.currentThread().getId() ", Name: "
Thread.currentThread().getName()));
executor.shutdown();
}
}
uj5u.com熱心網友回復:
問:什么時候我會使用 Executor 而不是 ExecutorService?
答:當你知道你永遠不會使用任何一種ExecutorService方法時。
在有些情況下,你少數情況下也不會需要管理的執行服務在某些方面,有些情況下,你就不需要管理服務幾個應用程式。
(假設……如果您要創建自己的任務執行機制,而不涉及在本地執行緒中運行任務,則 的管理功能ExecutorService可能不適合。)
問:我可以
ExecutorService到處使用嗎?
A:假設您實體化了 的實體ExecutorService,是的。
問:有沒有辦法為 Executor 的執行添加顯式關閉,或者它的一般做法是什么?
如果你問你是否可以關閉整個Executor,沒有沒有辦法。
Executor服務是一個介面。從一般意義上講,它可以以根本無法關閉的方式實作。但無論哪種方式,如果您不知道 executor 是如何實作的,那么您就不知道如何告訴它自行關閉。
(當然......如果你知道它很可能是 a ExecutorService,那么你可以輸入 cast toExecutorService然后呼叫ExecutorService.shutdown()。)
另一方面,如果您問是否可以取消由 提交的特定任務Executor.execute,答案也是否定的。
但是如果你使用這些ExecutorService.submit方法,你會Future為每個任務得到一個。如果當前正在運行,您可以使用Future.cancel()停止相應的任務運行或中斷它。
uj5u.com熱心網友回復:
您應該使用該ExecutorService介面來管理執行程式服務。該介面通常由創建或擁有執行程式服務的物件使用。
只需要使用在別處管理的執行程式來執行內容的物件或方法應該采用型別為 的引數Executor。您可以傳遞 的實體ExecutorService,因為它實作了Executor.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/403037.html
標籤:
上一篇:如何在另一個Python中呼叫PythonTornadoWebsocket服務器
下一篇:C#-等待具有回傳值的任務
