2016-04-02 20 views
0

tarafından çağrılan callable işlemi nasıl sonlandırılır Aşağıdaki kodda ExecutorService tarafından sunulan Callable işlemini sonlandırmak istiyorum. Halihazırda, kapsayıcı işlemin yürütülmesi, döngü yürütme işleminden önce çağrılan kapatma işlemine rağmen sonlandırılmamaktadır.ExecutorService

Herhangi bir öneride yardımcı olabilir. Biz showDownNow() çağırdığınızda

package foundation.util.sql.parser; 

import java.io.IOException; 
import java.util.HashMap; 
import java.util.concurrent.*; 

public class Test { 

    public static void main(String[] args) { 
     try { 

      final java.util.Map<String, ExecutorService> map = new HashMap<>(); 
      ExecutorService service = Executors.newFixedThreadPool(1); 
      map.put("1", service); 
Thread thread = new Thread(new Runnable() { 

       @Override 
       public void run() { 
        try { 

         System.out.println("Termination Initiated"); 
         ExecutorService executorService = map.get("1"); 
         System.out.println("ShutDown called"); 

         if(!executorService.isShutdown()) 
         { 
          executorService.shutdownNow(); 
         } 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
      Future<Boolean> submit = service.submit(new Callable<Boolean>() { 

       @Override 
       public Boolean call() throws Exception { 
        int j = 0; 
        System.out.println(Thread.currentThread().getName()); 
        for (int i=0; i<5000;i++) { 
         //Some business Process. 
         j = i; 
        } 
        System.out.println("Test____"+ j); 
        return null; 
       } 
      }); 
      thread.start(); 
      submit.get(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

cevap

0

o sadece görevleri yürütme anda durdurmak için ve girişimlerini başlatılmasını bekleyen görevleri önler

aslında

yılında, çalışan görevleri sona etmez. javadoc

gereğince

hiçbir garanti çabayı gösterme görevlerini yürütürken aktif işlemeyi durdurmak için çalışır ötesinde bulunmaktadır. Örneğin, tipik uygulamalar Thread.interrupt(), aracılığıyla iptal edilecektir, böylece kesintilere yanıt vermeyen herhangi bir görev hiçbir zaman sonlanmayabilir. senin çağrılabilir olarak

Eğer kesmeleri kontrol/yanıt değildir. interrupt flag öğesi true olarak ayarlanmışsa, periyodik olarak kontrol etmeniz gerekir. Eğer öyleyse, gerekirse temizleyin ve sonlandırın.

Örnek olarak, sizin durumunuzda aşağıdaki gibi (ya da her yerde geçerli) interrupt flag kontrol düşünebiliriz: değerli cevap için

for (int i=0; i<5000;i++) { 
    //Some business Process. 
    if(Thread.currentThread().isInterrupted()) { 
    // do any cleanup and return from here. 
    return false; 
    } 
    j = i; 
} 
+0

teşekkür ederiz. – user3876801

İlgili konular