2017-06-07 2 views
0

J'ai un programme Java qui s'exécute sur une planification et récupère certaines données de sources externes via des appels RFC. Les appels RFC sont threadés et doivent être annulés après 60 secondes. Voici comment je le fais:Java - annuler correctement l'exécution du thread après TimeoutException

Future<String> future = executor.submit(new MyCallable()); 
try { 
    future.get(60, TimeUnit.SECONDS); 
} catch (TimeoutException e) { 
    future.cancel(true); 
} 

Cela a fonctionné pendant longtemps jusqu'à ce que je suis tombé sur une situation où l'appel RFC externe est resté coincé et future.cancel (vrai) n'a pas pu interrompre le fil d'exécution. Donc, mon programme Java n'a jamais fini et a continué à fonctionner jusqu'à ce que j'annule manuellement le processus correspondant dans le système externe.

Ma question est maintenant, comment peut-on garantir le code de finir dans n'importe quelle situation? J'ai vu que l'arrêt du fil est déprécié.

Serait-ce une bonne idée de faire comme ça?

try { 
    future.get(60, TimeUnit.SECONDS); 
} catch (TimeoutException e) { 
    future.cancel(true); 
    if(!future.isDone()){ 
     System.exit(1); 
    } 
} 

Merci pour vos idées.

Cheers, Jooo

Répondre

0

Je crois qu'il n'y a aucun moyen en Java pour tuer juste à côté d'un fil lors de l'exécution si pas mis en œuvre InterruptedException. Si le thread s'exécute, il ne fait que marquer un drapeau et c'est au thread de le remarquer. Si le thread attend ou dort, il lancera une exception InterruptedException.

Pas besoin de vérifier après chaque ligne, bien sûr, mais les méthodes qui peuvent prendre beaucoup de temps pour exécuter sont responsables de la manipulation correctement les interruptions

tuer le processus dans lequel le fil est en cours d'exécution. (Par exemple, appelez System.exit (int).)