2013-04-09 5 views
12
final ExecutorService executor = Executors.newFixedThreadPool(1); 
final Future<?> future = executor.submit(myRunnable); 
executor.shutdown(); 
if(executor.awaitTermination(10, TimeUnit.SECONDS)) { 
    System.out.println("task completed"); 
}else{ 
    System.out.println("Executor is shutdown now"); 
} 

//MyRunnable method is defined as task which I want to execute in a different thread. 

यहाँ निष्पादक वर्ग के run विधि है:जावा एक्जिक्यूटर क्लास में सभी रननेबल थ्रेड को कैसे रोकें?

public void run() { 
try { 
    Thread.sleep(20 * 1000); 
} catch (InterruptedException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
}} 

यहाँ यह 20 पल के लिए इंतज़ार कर रहा है, लेकिन यह एक अपवाद फेंकता है जब मैं कोड चलाएँ:

java.lang.InterruptedException: sleep interrupted 
at java.lang.Thread.sleep(Native Method) 

मैं नहीं पा रहा हूँ Java Executor class में बर्बाद समवर्ती थ्रेड को बंद करें।

  • कार्यों को पूरा करने के लिए 10 सेकंड के लिए कुछ कार्य अर्थात में MyRunnable
  • executor इंतजार लिखा चलाने के लिए जावा निष्पादक वर्ग के साथ एक नया थ्रेड निर्मित: यहाँ मेरी कोड प्रवाह है।
  • काम तो पूरा कर लिया है, तो runnable धागा भी समाप्त हो गया।
  • कार्य 10 सेकंड के भीतर पूरा नहीं किया जाता है तो executor वर्ग धागा समाप्त करना चाहिए।

सब कुछ पिछले परिदृश्य में कार्य की समाप्ति को छोड़कर ठीक काम करता है। मैं इसे कैसे करूं?

+0

[जावा: एक्जिक्यूटर्स सर्विस थ्रेड की रोकथाम] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/5946562/java-force-stopping-of-executorservice-threads) – Perception

उत्तर

12

shutDown() विधि बस अनुसूचित होने से अतिरिक्त कार्यों को रोकता है। इसके बजाय, आप shutDownNow() पर कॉल कर सकते हैं और अपने Runnable में थ्रेड बाधा की जांच कर सकते हैं।

// in your Runnable... 
if (Thread.interrupted()) { 
    // Executor has probably asked us to stop 
} 

एक उदाहरण के लिए, अपने कोड के आधार पर, हो सकता है:

final ExecutorService executor = Executors.newFixedThreadPool(1); 
executor.submit(new Runnable() { 
    public void run() { 
    try { 
     Thread.sleep(20 * 1000); 
    } catch (InterruptedException e) { 
     System.out.println("Interrupted, so exiting."); 
    } 
    } 
}); 

if (executor.awaitTermination(10, TimeUnit.SECONDS)) { 
    System.out.println("task completed"); 
} else { 
    System.out.println("Forcing shutdown..."); 
    executor.shutdownNow(); 
} 
+0

कृपया प्रश्न में रन विधि देखें। मैंने कोशिश की लेकिन अपवाद फेंकता –

+0

ऊपर मेरा संपादन देखें। यह कोड नमूना दस सेकंड तक इंतजार करेगा, फिर शटडाउन को मजबूर करेगा। –

+0

@Ducan वास्तव में मैं ऊपर कोड के साथ करने की कोशिश की, लेकिन यह एक अपवाद है जो मैं अपने प्रश्न –

1

यह आम तौर पर एक बुरा विचार बाहर से एक चल धागा समाप्त करने के लिए है, क्योंकि आप धागा राज्य पता नहीं है वर्तमान में है। यह संभव है कि इसे कुछ सफाई करने की ज़रूरत है, और जब आप इसे मजबूती से बंद कर देते हैं तो यह ऐसा करने में सक्षम नहीं होगा। That's why all methods of Thread which do that are marked as deprecated

यह कई तकनीकों जो इंटरप्रोसेस संवाद प्रक्रिया धागा ही यह आम तौर पर अपने काम और बाहर निकलने निरस्त करने के लिए है कि में चल रहे संकेत करने के लिए के लिए उपलब्ध हैं में से एक का उपयोग करने के लिए बहुत बेहतर है। ऐसा करने का एक तरीका है अपने रननेबल में abort() विधि जोड़ने के लिए, जो volatile के रूप में घोषित ध्वज उठाता है। आपके चलने योग्य चेक का आंतरिक पाश उस ध्वज को उठाए जाने पर झंडा और बाहर निकलता है (एक नियंत्रित फैशन में)।

+0

चलाने के लिए मैं बस के बारे में यह कहना था थ्रेड महत्वपूर्ण है। यही कारण है कि Thread.stop() को हटा दिया गया है: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#stop() – CodeChimp

+5

' निष्पादक सेवा ', मैं ध्वज के बजाए थ्रेड बाधा का समर्थन करने के लिए वोट दूंगा।कई ढांचे में, सेवा 'shutdownNow() 'के साथ समाप्त कर दी जाएगी। –

संबंधित मुद्दे