在Java中,將ExecutorService轉為守護程式
問題描述
我正在Java 1.6中使用一個ExecutoreService,簡單地開始
ExecutorService pool = Executors.newFixedThreadPool(THREADS).
當我的主執行緒完成(以及由執行緒池處理的所有任務)時,此池將阻止我的程式關閉,直到我明確地呼叫
pool.shutdown();
我可以避免通過某種方式將這個池使用的內部執行緒管理轉換成deamon執行緒來呼叫嗎?或者我在這裡遺漏了一些東西。
最佳解決方案
大概最簡單和最優的解決方案是在Marco13’s answer中,所以不要被投票差異(我的回答是幾年前)或接受標記(這意味著我的解決方案適合於OP情況不是最好的)。
您可以使用ThreadFactory
將Executor中的執行緒設定為守護程式。這將影響執行器服務,它也將成為守護程序執行緒,因此如果沒有其他non-daemon執行緒,它(以及由其處理的執行緒)將停止。這是一個簡單的例子:
ExecutorService exec = Executors.newFixedThreadPool(4,
new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = Executors.defaultThreadFactory().newThread(r);
t.setDaemon(true );
return t;
}
});
exec.execute(YourTaskNowWillBeDaemon);
但是如果你想獲得執行器,讓它的任務完成,同時在應用程式完成後會自動呼叫它的shutdown()
方法,你可能希望用Guava’s MoreExecutors.getExitingExecutorService
來包裝你的執行器。
ExecutorService exec = MoreExecutors.getExitingExecutorService(
(ThreadPoolExecutor) Executors.newFixedThreadPool(4 ),
100_000, TimeUnit.DAYS//period after which executor will be automatically closed
//I assume that 100_000 days is enough to simulate infinity
);
//exec.execute(YourTask);
exec.execute(() -> {
for (int i = 0; i < 3; i++) {
System.out.println("daemon");
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
}
});
次佳解決方案
已經有一個內建功能用於建立一個ExecutorService
,在一段時間不活動後終止所有執行緒:您可以建立一個ThreadPoolExecutor
,傳遞所需的時序資訊,然後在此執行器服務上呼叫allowCoreThreadTimeout(true)
:
/**
* Creates an executor service with a fixed pool size, that will time
* out after a certain period of inactivity.
*
* @param poolSize The core- and maximum pool size
* @param keepAliveTime The keep alive time
* @param timeUnit The time unit
* @return The executor service
*/
public static ExecutorService createFixedTimeoutExecutorService(
int poolSize, long keepAliveTime, TimeUnit timeUnit)
{
ThreadPoolExecutor e =
new ThreadPoolExecutor(poolSize, poolSize,
keepAliveTime, timeUnit, new LinkedBlockingQueue<Runnable>());
e.allowCoreThreadTimeOut(true);
return e;
}
EDIT Referring to the remarks in the comments: Note that this thread pool executor will not automatically shut down when the application exits. The executor will continue to run after the application exits, but no longer than the
keepAliveTime
. If, depending on the precise application requirements, thekeepAliveTime
has to be longer than a few seconds, the solution in the answer by Pshemo may be more appropriate: When the threads are set to be daemon threads, then they will end immediately when the application exits.
第三種解決方案
我會使用Guava的ThreadFactoryBuilder類。
ExecutorService threadPool = Executors.newFixedThreadPool(THREADS, new ThreadFactoryBuilder().setDaemon(true).build());
如果你還沒有使用Guava,我會去一個ThreadFactory子類,如Pshemo’s answer頂部所述
第四種方案
是。
您只需建立自己的ThreadFactory
類,即建立守護程序執行緒而不是常規執行緒。
參考文獻
注:本文內容整合自google/baidu/bing輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:gxnotes#qq.com(#替換為@)。
相關推薦
在Java中,將ExecutorService轉為守護程式
問題描述 我正在Java 1.6中使用一個ExecutoreService,簡單地開始 ExecutorService pool = Executors.newFixedThreadPool(THREADS). 當我的主執行緒完成(以及由執行緒池處理的所有任務)時
Oracle中存儲圖片的類型為BLOB類型,Java中如何將其讀取並轉為字符串?
ava 字節數組 object [] str string類 arch data mpi 一,讀取圖片轉為String類型: 需要使用Sun公司提供的Base64工具 String str = ((Map) list1.get(0)).get("EINVOICEFILE")
Java中,如何將日期的字串轉換為對應的Date型別
所有時間日期都可以被SimpleDateFormat格式化format() 日期和時間格式由 日期和時間模式字串 指定。在 日期和時間模式字串 中,未加引號的字母 'A' 到 'Z' 和 'a' 到 'z' 被解釋為模式字母,用來表示日期或時間字串元素。文字可以使用單引號
三句話解釋:java中,byte轉為int為何要&0xff
第一,oxff預設為整形,二進位制位最低8位是1111 1111,前面24位都是0; 第二,&運算: 如果2個bit都是1,則得1,否則得0; 第三,byte的8位和0xff進行&運
程式設計師面試金典: 9.14 Java 14.2在Java中,若在try-catch-finally的try語句塊中插入return語句,finally語句塊是否還會執行?
問題:在Java中,若在try-catch-finally的try語句塊中插入return語句,finally語句塊是否還會執行? 分析:不一定。如果在try語句中走到return語句之前都沒有發生異常,會走到return語句,就直接返回了。 如
java中怎麼將一個檔案內容寫入到另一個檔案,這裡分別使用io和nio來實現
一:使用io來實現將一個檔案內容寫入到另一個檔案 需要兩個檔案流,檔案輸入流和檔案輸出流,中間還需要一個作為記憶體中的輔助空間(類似於裝東西的小車),我們可以使用一個位元組陣列。 迴圈使用小車,從倉庫(源頭)運貨到商場(目的地)。 package aboutIO; import jav
在eclipse中,將java工程轉換成web工程
今天check out svn上的工程,發現竟然是java工程。於是嘗試將java工程修改成web工程。 java工程和web工程的區別在於,工作空間工程下面的.project檔案。 java工程的.project的標籤如下: <nature
android開發 在JNI函式中引用Java類,將cxx複雜資料轉換成jobjectArray,實現從JNI到Java的資料傳輸
引言: JNI是Java可以呼叫高效的c++程式碼,但是在JNI函式中傳遞複雜資料型別十分的繁瑣,一般情況下需要jobject作為中轉,一維陣列int[],float[]以及二維陣列String[]可以實現方便的引數傳入/傳出。其他複雜的二、三維陣列理論上可以
java中Executor、ExecutorService、ThreadPoolExecutor介紹
cut .net mil col 20px 介紹 bsp tex exe java中Executor、ExecutorService、ThreadPoolExecutor介紹 ExecutorService 的理解與使用 java中Executor、ExecutorSer
Java中如何將字符串數組轉換成字符串
bst sub 字符串 ++ 循環 數組 tostring ringbuf 轉換 如果將“字符串數組”轉換成“字符串”,只能通過循環,沒有其他方法: public static String getExecSqlString(String str){ StringBuf
java中,什麽是構造函數?什麽是構造函數重載?什麽是復制構造函數?
默認 調用 構造函數 多個 必須 自己 ava nbsp 每一個 當新對象被創建的時候,會調用構造函數。每一個類都有構造函數。在程序員沒有給類提供構造函數的情況下,java編譯器會為這個類創建一個默認的構造函數。 java中構造函數的重載和方法重載很相似。
使用java中,面向對象封裝+繼承的方法算題
去掉空格 方法 amp get urn 余數 oid pan 新的 1.第一種:給定一行字符,逆序輸出此字符串(空格.數字不輸出),如“ab 23,(4 cd”輸出“dc(,ba”。(要求:使用面向對象封裝+繼承) class Bu { private Strin
Java 中要將 String 類型轉化為 int 類型
ava index 需要 amp con 轉換 catch div 出現 在 Java 中要將 String 類型轉化為 int 類型時,需要使用 Integer 類中的 parseInt() 方法或者 valueOf() 方法進行轉換. 例1: 1 2 3 4 5
Java中,類及其組成所使用的常見修飾符
成員 name fin 常用 tro string prot 默認 abstract Java中,類及其組成所使用的常見修飾符 (1)修飾符的分類: 權限修飾符:private、默認、protected、public 狀態修飾符:static、fin
Java中,內部類的概述和內部類的訪問特點和內部類的分類(內部類的位置)
back 外部 mage 對象 post info bsp 一個 strong 內部類的概述: 把類定義在另一個類的內部,該類就被稱為內部類。 舉例:把類B定義在類A中,類B就被稱為內部類。 內部類的訪問特點: A:內部類可以直接訪問外部類的成員,包括
Java中,局部內部類
外部類 col 局部變量 外部 成員 變量名 class post 常量值 局部內部類 A:局部內部類可以直接訪問外部類的成員。 B:局部內部類在局部位置可以創建內部類對象,通過內部類對象調用內部類方法,來使用局部內部類功能。 C:局部內部類訪問局部變量
Java中,匿名內部類
java () ack http 代碼 一個 back 抽象 子類 匿名內部類 就是局部內部類的簡化寫法。 前提:存在一個類或者接口。 這裏的類可以是具體類也可以是抽象類。 格式: new 類名或者接口名() { 重寫方法; }
Java中,權限修飾符的權限測試
註意 div pre package img string 需要 fat prot ============================================================================= 1、 1 /* 2
在java中,輸入兩個數,輸出較大的數
ring bsp println OS [] tint sys span 適用於 第一種 1 import java.util.*; 2 public class A{ 3 public static void main(String[] args){ 4
java利用反射將pojo轉為json對象
需要 ktr OS reflect res pojo json.js code substring 最近做以太坊錢包項目需要與前臺進行json交互,寫一個工具類,經普通javaBean轉為json對象 1 package util; 2 3 import java