में धागे के लिए टाइमआउट सेट करें, मैं थ्रेड पूल के भीतर निष्पादित थ्रेड के लिए टाइमआउट सेट करना चाहता हूं। फिलहाल मैं निम्नलिखित कोड है:जावा: थ्रेडपूल
ExecutorService executor = Executors.newFixedThreadPool(8);
for(List<String> l: partition) {
Runnable worker = new WorkerThread(l);
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) {
}
कोड सिर्फ उप-सूचियों में वस्तुओं की एक बड़ी सूची विभाजन और एकल धागे के भीतर इन sublist की प्रक्रिया। लेकिन यह बात नहीं है।
मैं थ्रेड पूल में प्रत्येक सिंगल थ्रेड को टाइमआउट देना चाहता हूं। पूल में केवल एक धागे के लिए मुझे निम्नलिखित समाधान मिला:
Future<?> future = null;
for (List<String> l : partition) {
Runnable worker = new WorkerThread(l);
future = executor.submit(worker);
}
try {
System.out.println("Started..");
System.out.println(future.get(3, TimeUnit.SECONDS));
System.out.println("Finished!");
} catch (TimeoutException e) {
System.out.println("Terminated!");
}
लेकिन यह एक से अधिक धागे के लिए काम नहीं करेगा। हो सकता है कि मुझे प्रत्येक थ्रेड को List<Future>
सूची में रखना होगा और इस सूची में पुनरावृत्त करना होगा और प्रत्येक future
ऑब्जेक्ट के लिए टाइमआउट सेट करना होगा?
कोई सुझाव?
CountDownLatch उपयोग करने के बाद संपादित करें:
CountDownLatch doneSignal = new CountDownLatch(partition.size());
List<Future<?>> tasks = new ArrayList<Future<?>>();
ExecutorService executor = Executors.newFixedThreadPool(8);
for (List<String> l : partition) {
Runnable worker = new WorkerThread(l);
tasks.add(executor.submit(doneSignal, worker));
}
doneSignal.await(1, TimeUnit.SECONDS);
if (doneSignal.getCount() > 0) {
for (Future<?> fut : tasks) {
if (!fut.isDone()) {
System.out.println("Task " + fut + " has not finshed!");
//fut.cancel(true) Maybe we can interrupt a thread this way?!
}
}
}
अब तक अच्छा काम करता है।
तो अगला सवाल यह है कि समय समाप्त होने वाले थ्रेड को कैसे बाधित किया जाए? मैं fut.cancel(true)
कोशिश करते हैं और निम्नलिखित कार्यकर्ता सूत्र में कुछ महत्वपूर्ण छोरों में निर्माण जोड़ें:
if(Thread.interrupted()) {
System.out.println("!!Thread -> " + Thread.currentThread().getName() + " INTERRUPTED!!");
return;
}
तो कार्यकर्ता धागा टाइमआउट के बाद "मारा" है। क्या यह एक अच्छा समाधान है?
इसके अलावा: क्या Future
इंटरफ़ेस पर थ्रेड का नाम प्राप्त करना संभव है? फिलहाल मुझे Thread.interrupted()
निर्माण की स्थिति में नाम प्रिंट करना होगा।
मदद के लिए धन्यवाद!
सम्मान
हाँ यह और अधिक काम करता है, बस सूची में फ़्यूचर्स रखें। – Fildor
कृपया इस तरह के धागे के बारे में मत सोचो। कुछ किया जा रहा है, और यदि आप एक निश्चित समय से अधिक समय लेते हैं तो आप एक टाइमआउट चाहते हैं। यह काम नहीं करने के लिए जो भी धागा हो सकता है, यह * काम * है। शायद दो धागे काम पर सहयोग कर रहे हैं। हो सकता है कि उस समय उस काम पर कोई धागा काम नहीं कर रहा हो। लेकिन यह * काम * है जिसे आप रोकना या टाइमआउट करना चाहते हैं या जो कुछ भी थ्रेड या थ्रेड नहीं कर सकते हैं जो उस पर काम करने के लिए हो सकता है या नहीं। धागे के बारे में सही ढंग से सोचने के लिए यह सूक्ष्म दृश्य शिफ्ट महत्वपूर्ण है ताकि आप अच्छे डिज़ाइनों के साथ आगे बढ़ सकें। –
@ डेविडस्वार्टज़ अच्छा बिंदु, हालांकि हालात हो सकते हैं कि काम एक दूसरे से पूरी तरह से स्वतंत्र हैं। मुझे नहीं पता कि ओपी वास्तव में इसके बारे में हालांकि, लेकिन ऐसा लगता है कि यह मामला यहां है। – fge