2012-07-11 11 views
9

मैं Callable और ExecutorService इंटरफेस का परीक्षण करने के लिए नमूना अनुप्रयोग को लागू करने का प्रयास कर रहा हूं।निष्पादक सेवा में सबमिट किए गए कॉल योग्य को कैसे रोकें?

मेरे ऐप में मैं घोषणा की है:

ExecutorService exSvc = Executors.newSingleThreadExecutor(); 

तब:

Future<Integer> test = exSvc.submit(
    new Callable<Integer>() { 
     public Integer call() { 
      for(int i = 0; i < 1000; i++){ 
       System.out.println(i); 
      } 
      return 1; 
     } 
    }); 

अब मैं प्रक्रिया को रोकने के होने से पहले ही समाप्त कर दें, मैं exSvc.shutdownNow() उपयोग कर रहा हूँ कोशिश कर रहा हूँ, लेकिन यह नहीं है काम।

शानदार शास्त्रीय Thread को रोकने के लिए मैं आमतौर पर स्थिति चर का उपयोग करता हूं। ExecutorService के साथ पालन करने के लिए एक आम तरीका कौन सा है?

उत्तर

16

Future.cancel(true) और ExecutorService.shutdownNow() उपयोग धागा रुकावट। जब तक आप अपने कार्य में uninterruptable अवरुद्ध कॉल कर नहीं है, आप सभी की जरूरत को सही ढंग से बाधित हालत को संभालने के लिए, कुछ इस तरह है: आप करते हैं

for(int i = 0; i < 1000; i++){ 
    // Uses isInterrupted() to keep interrupted status set 
    if (Thread.currentThread().isInterrupted()) { 
     // Cannot use InterruptedException since it's checked 
     throw new RuntimeException(); 
    } 
    System.out.println(i); 
} 

uninterruptable अवरुद्ध कॉल (जैसे नेटवर्क आईओ के रूप में), बातें अधिक जटिल बनें, आपको किसी भी तरह मैन्युअल रूप से उन्हें बाधित करने की आवश्यकता है, उदाहरण के लिए, अंतर्निहित सॉकेट बंद करके।

+0

क्या थ्रेड बाधा का उपयोग किए बिना प्रक्रिया को रोकने का कोई तरीका है? – davioooh

+0

यह स्पष्ट नहीं है कि आप वास्तव में क्या चाहते हैं। 'shutdownNow()' पहले से ही व्यवधान का उपयोग करता है। – axtavt

+0

हां, वास्तव में मैं पूछ रहा हूं कि इसे कैसे रोकें ** बिना ** थ्रेड बाधा के। 'ExecdownNow()' का उपयोग करना 'निष्पादक सेवा' को सबमिट किए गए थ्रेड को रोकने का एकमात्र तरीका है? – davioooh

3

इस प्रकार मैं इसे FixedThreadPool के साथ करूँगा, उम्मीद है कि यह कुछ मदद की है।

ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 

    List<Future<Void>> results = new ArrayList<>(); 

    for (int i = 0; i < numberOfJobs; i++) { 
     MyCallableJob job = new MyCallableJob (...); 
     results.add(pool.submit(job)); 
    } 

    for (Future<Void> result : results) { 
     try { result.get(); } 
     catch (InterruptedException | ExecutionException ignorable) { } 
    } 

    pool.shutdown(); 
संबंधित मुद्दे