2010-06-17 12 views
1

Je dois appeler un module de fonction tiers sur un nouveau thread. D'après ce que j'ai vu, l'appel se termine rapidement si tout s'est bien passé ou il se bloque à jamais pour enfermer le fil. Quelle est une bonne façon de démarrer le thread et faire l'appel et attendre quelques secondes et si le thread est toujours en vie, puis en supposant qu'il est verrouillé, tuer (ou arrêter ou abandonner) le fil sans utiliser de méthodes obsolètes.Meilleure façon d'identifier et d'éliminer le thread verrouillé dans Java

J'ai quelque chose comme ça pour l'instant, mais je ne suis pas sûr que ce soit la meilleure façon de le faire et je veux éviter d'appeler Thread.stop() comme c'est obsolète. Merci.

private void foo() throws Exception 
{ 
     Runnable runnable = new Runnable() 
     { 

      @Override 
      public void run() 
      { 
        // stuff that could potentially lock up the thread. 
      } 
     }; 
     Thread thread; 
     thread = new Thread(runnable); 
     thread.start(); 
     thread.join(3500); 
     if (thread.isAlive()) 
     { 
      thread.stop(); 
      throw new Exception(); 
     } 

} 
+0

Donc, fondamentalement, vous voulez lancer un thread, puis l'arrêter s'il est encore en vie après une certaine période de temps? –

+0

@matt_b oui, exactement! –

Répondre

2
public void stop() { 
     if (thread != null) { 
      thread.interrupt(); 
     } 
    } 

See this link sur Comment arrêter un fil, il couvre bien le sujet

+1

Je suis abattu parce que l'appel de votre méthode 'stop' montre une compréhension naïve et incorrecte de l'interruption du Thread au mieux. En tant que FYI @Romain Hippeau, ce n'est pas parce que vous appelez l'interruption sur un thread que cela va s'arrêter. Si l'implémentation de ce code est assez pauvre pour causer un interblocage, alors il est certainement assez pauvre pour mal gérer une exception InterruptedException ou ne pas vérifier l'indicateur d'interruption de manière appropriée. –

+0

@Tim Bender - La question est de savoir comment arrêter un thread. La mise en œuvre de la routine ne fait pas partie de la question. Si vous lisez le lien que j'ai dans la réponse, il couvre tout cela. Pour le compte rendu, qu'il soit montré «Je ne pense pas que le vote à la baisse était juste». P.S. merci de mettre une explication pourquoi au lieu de juste downvoting (je déteste cela) –

0

je regarderais dans le cadre java.util.concurrentExecutor et plus précisément l'interface Future<T>. avec ceux-ci vous êtes quelque peu extrait des caprices de java.lang.Thread, et vous obtenez un bon découplage de ce que sont les tâches de leur exécution (que ce soit sur un thread séparé, si le thread provient d'un pool ou est instancié sur le voler, etc.)

Une instance future, au moins, vous donne les méthodeset isCancelled.

La sous-interface ExecutorService (sous-interface de Executor) vous permet de fermer toutes les tâches en encours. Ou consultez la méthode ExecutorService.awaitTermination(long timeout, TimeUnit unit)

private void foo() throws Exception 
{ 
     ExecutorService es = Executors.newFixedThreadPool(1); 

     Runnable runnable = new Runnable() 
     { 

      @Override 
      public void run() 
      { 
        // stuff that could potentially lock up the thread. 
      } 
     }; 

     Future result = es.submit(runnable); 

     es.awaitTermination(30, TimeUnit.SECONDS); 

     if (!result.isDone()){ 
      es.shutdownNow(); 
     } 

} 
1

Il n'y a aucun moyen de faire ce que vous voulez (sans conditions). Par exemple, si l'stuff that could potentially lock up the thread. ressemble à ceci, il n'y a pas moyen de l'arrêter, jamais à court de System.exit():

public void badStuff() { 
while (true) { 
    try { 
    wait(); 
    } 
    catch (InterruptedException irex) { 
    } 
} 
} 

Lorsque votre application est bloqué, exécutez jstack (ou utilisez le débogueur). Essayez de comprendre ce qui colle la fonction et la réparer.

+1

Ou obtenir un vidage JVM en utilisant: kill -QUIT pid –

+1

Cela ne fonctionne que sur unix, jstack est multi-plateforme. – Justin

+0

La fonction que j'appelle est dans un module tiers et je n'ai aucun contrôle sur elle, malheureusement. Donc, il n'y a aucun moyen de le réparer à moins que je reçois une mise à jour de l'auteur du module. –

Questions connexes