मैं जावा प्रोजेक्ट पर काम कर रहा हूं जहां मुझे असीमित रूप से चलने वाले कई कार्य करने की आवश्यकता है। मुझे विश्वास है कि निष्पादक मेरे लिए ऐसा करने का सबसे अच्छा तरीका है, इसलिए मैं इसे अपने साथ परिचित कर रहा हूं। (यद्यपि सीखने के लिए भुगतान हो रहा है!) हालांकि, यह मुझे स्पष्ट नहीं है कि मैं जो करने की कोशिश कर रहा हूं उसे पूरा करने का सबसे अच्छा तरीका क्या है।जावा एक्जिक्यूटर कार्य के लिए सर्वोत्तम अभ्यास जो हमेशा के लिए चलाना चाहिए
तर्क के लिए, मान लें कि मेरे पास दो कार्य चल रहे हैं। न तो समाप्त होने की उम्मीद है, और दोनों को आवेदन के जीवन की अवधि के लिए चलना चाहिए। मैं एक मुख्य रैपर वर्ग लिखने की कोशिश कर रहा हूं कि:
- यदि कोई कार्य अपवाद फेंकता है, तो रैपर इसे पकड़ लेगा और कार्य को पुनरारंभ करेगा।
- यदि कोई कार्य पूरा होने के लिए चलता है, तो रैपर कार्य को नोटिस और पुनरारंभ करेगा।
अब, यह ध्यान दिया जाना चाहिए कि दोनों कार्यों के लिए कार्यान्वयन कोड run()
में अनंत लूप कि पूरा करने के लिए चलाए कभी नहीं होगा, एक आज़माएं/कैच ब्लॉक कि भंग किए बिना सभी क्रम अपवाद संभाल चाहिए के साथ रैप होगा पाश। मैं निश्चितता की एक और परत जोड़ने की कोशिश कर रहा हूँ; अगर मैं या मेरे पीछे आने वाला कोई ऐसा व्यक्ति बेवकूफ़ है जो इन सुरक्षा उपायों को हरा देता है और कार्य को रोकता है, तो आवेदन को उचित प्रतिक्रिया देने की आवश्यकता होती है।
क्या इस समस्या का सामना करने के लिए सबसे अच्छा अभ्यास है कि मेरे द्वारा अधिक अनुभवी लोगों की सिफारिश की जाएगी?
Fwiw, मैं मार पड़ी-अप किया है इस परीक्षण वर्ग:
public class ExecTest {
private static ExecutorService executor = null;
private static Future results1 = null;
private static Future results2 = null;
public static void main(String[] args) {
executor = Executors.newFixedThreadPool(2);
while(true) {
try {
checkTasks();
Thread.sleep(1000);
}
catch (Exception e) {
System.err.println("Caught exception: " + e.getMessage());
}
}
}
private static void checkTasks() throws Exception{
if (results1 == null || results1.isDone() || results1.isCancelled()) {
results1 = executor.submit(new Test1());
}
if (results2 == null || results2.isDone() || results2.isCancelled()) {
results2 = executor.submit(new Test2());
}
}
}
class Test1 implements Runnable {
public void run() {
while(true) {
System.out.println("I'm test class 1");
try {Thread.sleep(1000);} catch (Exception e) {}
}
}
}
class Test2 implements Runnable {
public void run() {
while(true) {
System.out.println("I'm test class 2");
try {Thread.sleep(1000);} catch (Exception e) {}
}
}
}
यह रास्ता मैं चाहता हूँ से व्यवहार कर रहा है, लेकिन मैं अगर वहाँ किसी भी gotchas हैं पता नहीं है, अक्षमताओं, या पूरी तरह गलत-headedness प्रतीक्षा मुझे आश्चर्यचकित करने के लिए। (वास्तव में, यह देखते हुए कि मैं इसके लिए नया हूं, अगर इसके बारे में कुछ गलत/अव्यवस्थित नहीं था तो मुझे आश्चर्य होगा।)
किसी भी अंतर्दृष्टि का स्वागत है।
आप उन दो कार्यों यह अपने आप ही एकल पिरोया निष्पादक से प्रत्येक चलाते हैं, तो आप सिर्फ काम के 1000 प्रतियां निष्पादक में डाल सकते हैं। :-) –
तो यदि कोई कार्य विफल रहता है, तो 99 9 अपनी जगह लेने का इंतजार कर रहे हैं? हे। प्यारा, लेकिन मेरा विश्वास करो, मुझे वास्तव में इस चूसने वाले को बुलेटप्रूफ होने की आवश्यकता है क्योंकि मैं इसे बना सकता हूं। इसलिए अनिवार्य रूप से एक समुदाय कोड समीक्षा के लिए यह अनुरोध। – BlairHippo
ठीक है, बुलेटप्रूफ के विषय पर: डेडलॉक या अन्य लाइफ विफलताओं में आने वाले कार्यों से निपटने के लिए आपकी वर्तमान योजना क्या है? सिर्फ इसलिए कि आप बार-बार फिर से शुरू कर सकते हैं इसका मतलब यह नहीं है कि यह चल रहा रहेगा, अगर वे समस्याएं अनिश्चित काल तक उन्हें पकड़ सकती हैं। –