2017-05-19 16 views
10

में बाधित कैसे करें मेरे पास एक निष्पादक सेवा है जिसके लिए मैं कुछ काम करने के लिए एकाधिक थ्रेड सबमिट कर रहा हूं, अब मैं कुछ धागे के निष्पादन को रद्द/बाधित करना चाहता हूं, चलो मुझे पता है मैं यह कैसे कर सकता हूँ?निष्पादक सेवा में सबमिट किए गए थ्रेड को कैसे प्राप्त करें और इसे जावा

उदाहरण के लिए: - नीचे मेरी थ्रेड क्लास है जो कुछ अंतराल के बाद थ्रेड नाम मुद्रित करती है।

public class MyThread implements Runnable { 
String name; 

public MyThread(String name) { 
    this.name = name; 
} 

@Override 
public void run() { 
    try { 
     System.out.println("Thread "+ name + " is running"); 
     sleep(500); 
    }catch (InterruptedException e){ 
     System.out.println("got the interrupted signal"); 
     e.printStackTrace(); 
    } 
} 
} 

अब मैं उन्हें नाम देकर एक से अधिक थ्रेड पैदा हो जाएगी, ताकि बाद में मैं उस विशेष धागा बीच में और इसके निष्पादन रोक सकता है।

अब मेरी टेस्ट कक्षा में मैं 4 धागे बनाने रहा हूँ और अमित और कश्मीर नामित 2 धागे के निष्पादन बंद करना चाहते हैं।

public class ThreadTest { 

public static void main(String[] args) { 
    ExecutorService executorService = Executors.newCachedThreadPool(); 
    MyThread amit = new MyThread("amit"); 
    MyThread k = new MyThread("k"); 
    MyThread blr = new MyThread("blr"); 
    MyThread india = new MyThread("india"); 
    executorService.submit(amit); 
    executorService.submit(k); 
    executorService.submit(blr); 
    executorService.submit(india); 

    // now i want to stop the execution of thread Named "amit" and "k". 
} 
} 

मुझे बताएं कि मैं यह कैसे कर सकता हूं?

+2

संकेत: 'execorService.submit' आपको 'भविष्य ' वापस देता है। –

+0

@ एंडी टर्नर, मुझे पता है कि यह 'भविष्य' देता है लेकिन क्या आप मुझे बता सकते हैं कि मैं अपने मामले में 'अमित' नाम के साथ धागे को पुनः प्राप्त करने के लिए इसका उपयोग कैसे कर सकता हूं और इसके निष्पादन को बाधित कर सकता हूं? –

+0

आपके 'MyThread' को' थ्रेड' 'बढ़ाने की आवश्यकता नहीं है। बस 'रननेबल' लागू करें। –

उत्तर

10

आपके MyThread एस वास्तव में उन नामों के साथ धागे पर नहीं चल रहे हैं। वे धागे के रूप में सीधे नहीं चल रहे हैं, वे ExecutorService के थ्रेड पर चल रहे हैं।

तो, आपको नाम का मानचित्रण Future पर रखना होगा, और फिर जब आप चाहें भविष्य को रद्द कर दें।

Map<String, Future<?>> map = new HashMap<>(); 
map.put("amit", executorService.submit(amit)); 
map.put("k", executorService.submit(k)); 
// ... etc 

फिर, amit रद्द करने के लिए:

map.get("amit").cancel(true); 
बेशक

, तो आप बस रखा जा सकता था स्पष्ट चर:

Future<?> amitFuture = executorService.submit(amit); 
amitFuture.cancel(true); 

लेकिन अगर आप चर का एक बहुत कुछ है इस बोझल हो सकता है ।

+0

लॉगिंग और डिबगिंग को आसान बनाने के लिए मुझे धागे पर अपना नाम देना भी संभव है? –

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