2016-03-23 29 views
0

Kodumda, bazı görevleri gerçekleştirmek için bir sürü iş parçacığı başlatmak üzere CompletionService ve ExecutorService kullanıyorum (çok fazla zaman alabilir). Bu yüzden ExecutorService ve CompletionService'yi oluşturan bir yöntem kullanıyorum, daha sonra iş parçacığı göndermeye başlar ve sonuçları alır. Yükleyiciyi incelikle kapatmak için bir kapatma çanı eklemek istiyorum (Muhtemelen, yürütmeyi durdurma yerine kaynakları serbest bırakmam gerektiğini bilmekteyim, fakat benim durumumda her bir iş parçacığının kendine ait kaynakları vardır, bu nedenle onları incelikle kapatmak, iyi bir ruh olabilir. Sanırım). Aşağıdaki koduJava kapanma kancası iç yöntemini ekle

public Class myClass{ 
... 
private CompletionService<ClusterJobs> completion; 
final long SHUTDOWN_TIME = TimeUnit.SECONDS.toSeconds(10); 

... 
public Message executeCommand(Message request){ 

final ExecutorService executor = Executors.newFixedThreadPool(30); 

completion = new ExecutorCompletionService<ClusterJobs>(executor); 

....//submit and take results 

Runtime.getRuntime().addShutdownHook(new Thread(){ 
      @Override 
      public void run() { 
       logger.debug("Shutting down executor"); 

       try { 
        if (!executor.awaitTermination(SHUTDOWN_TIME, TimeUnit.SECONDS)) { 
         logger.debug("Executor still not terminate after waiting time..."); 
         List<Runnable> notExecuted= executor.shutdownNow(); 
         logger.debug("List of dropped task has size " + droppedTasks.size()); 
        } 
       }catch(InterruptedException e){ 
        logger.error("",e); 
       } 
      } 
     }); 

} 
} 

yazma Bu nedenle

Eğer bu makul bir çözüm olduğunu düşünüyor musunuz yoksa kayıt ve yerel sınıflarını kullanarak kapatma kanca kaydını güvensiz mi? Design of the Shutdown Hooks API itibaren peşin

Selamlar

cevap

1

yılında

Teşekkür:

Basit kapatma kancaları genellikle bu örnekte olduğu gibi, anonim iç sınıflar olarak yazılabilir :

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { database.close(); } 
}); 

Bu deyim olduğunu Kancayı asla iptal etmeniz gerekmediği sürece, bu durumda, oluşturduğunuz zaman kancaya bir referans kaydetmeniz gerekir.