शायद सबसे सरल और पसंदीदा समाधान Marco13's answer में है इसलिए मतभेद मत बनो (मेरा जवाब कुछ साल पुराना है) या स्वीकृति चिह्न (इसका मतलब यह है कि मेरा समाधान ओपी परिस्थितियों के लिए उपयुक्त था कि यह सर्वोत्तम नहीं है) ।
आप ThreadFactory
का उपयोग डेमॉन को निर्वाहक अंदर धागे सेट करने के लिए कर सकते हैं। यह निष्पादक सेवा को इस तरह से प्रभावित करेगा कि यह डेमॉन थ्रेड भी बन जाएगा, इसलिए यह (और इसके द्वारा नियंत्रित धागे) बंद हो जाएंगे यदि कोई अन्य गैर-डिमन थ्रेड नहीं होगा।
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'sMoreExecutors.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();
}
}
});
वर्तमान में स्वीकार जवाब के लेखक दृष्टिकोण Marco13 द्वारा पोस्ट की गई पढ़ने सुझाव है कि के रूप में मैं: के बाद से समाधान वर्णित http://stackoverflow.com/a/29453160/1393766 और उसके लिए मेरे पद से स्वीकृति चिह्न बदल रहा है, वहाँ शायद है सबसे सरल और जो आप मूल रूप से हासिल करना चाहते थे उसे बंद कर देता है। – Pshemo
@Pshemo मुझे आपसे असहमत होने दें ... कृपया मार्को 13 के उत्तर के तहत मेरी टिप्पणी देखें। –
@Pshemo Vladimirs संकेत के संदर्भ में, आप इस तथ्य को इंगित करने पर विचार कर सकते हैं कि "सरल" समाधान हमेशा पसंदीदा नहीं हो सकता है। – Marco13