Comment arrêter tous les exécutables thread en java exécuteur de la classe?
final ExecutorService executor = Executors.newFixedThreadPool(1);
final Future<?> future = executor.submit(myRunnable);
executor.shutdown();
if(executor.awaitTermination(10, TimeUnit.SECONDS)) {
System.out.println("task completed");
}else{
System.out.println("Executor is shutdown now");
}
//MyRunnable method is defined as task which I want to execute in a different thread.
Ici est run
méthode de l'exécuteur testamentaire de la classe:
public void run() {
try {
Thread.sleep(20 * 1000);
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}}
Ici, il est en attente pour 20
deuxième mais quand je lance le code, il déclenche une exception:
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
Je ne suis pas en mesure de fermer les threads ruiner dans Java Executor class
. Voici mon Code:
- Créé un nouveau Fil de discussion avec Java exécuteur de la classe à exécuter une tâche que je.e écrit dans
MyRunnable
executor
attendre 10 secondes pour terminer les tâches.- Si la tâche est terminée, puis praticable fil a également obtenu de fin.
- Si la tâche n'est pas terminée dans un délai de 10 seconde puis
executor
classe doit mettre fin à la discussion.
Tout fonctionne bien sauf la résiliation de tâches dans le dernier scénario. Comment dois-je faire?
double possible de Java: Force l'arrêt de ExecutorService threads
OriginalL'auteur Amit Pal | 2013-04-09
Vous devez vous connecter pour publier un commentaire.
La
shutDown()
méthode empêche tout simplement des tâches supplémentaires à partir prévue. Au lieu de cela, vous pourriez l'appelershutDownNow()
et vérifier fil interruption dans votreRunnable
.Un exemple, basé sur votre code, peut-être:
Voir mon montage ci-dessus. Cet exemple de code attendez dix secondes, puis forcer l'arrêt.
Exactement, j'ai essayé avec le code ci-dessus, mais il jette mw d'une exception qui je l'ai écrit dans ma question
Une exception est levée, car vous avez choisi d'utiliser une méthode de blocage (
sleep()
) dans votre code d'exemple. C'est le bon comportement à adopter.Merci, Vous avez raison 🙂
OriginalL'auteur Duncan Jones
Il est généralement une mauvaise idée de mettre fin à un thread en cours d'exécution à partir de l'extérieur, parce que vous ne connaissez pas l'état du fil qui est actuellement dans. Il est possible qu'elle doit faire quelques nettoyages, et il ne sera pas en mesure de le faire lorsque vous force à l'arrêter. C'est pourquoi toutes les méthodes de Fil qui ne sont marqué comme obsolète.
C'est beaucoup mieux d'utiliser l'une des nombreuses techniques qui sont disponibles pour la communication interprocessus de signal de la procédure d'exécution dans le fil lui-même qu'il doit abandonner son travail et de quitter normalement. Une façon de le faire est d'ajouter une
abort()
méthode à votre exécutable, ce qui soulève un drapeau déclaré quevolatile
. La boucle intérieure de votre Exécutable vérifie que le drapeau et les sorties (de manière contrôlée) lorsque ce drapeau est hissé.Dans le cas spécifique d'un
ExecutorService
, je voterais pour soutenir fil interruption plutôt que d'un drapeau. Dans de nombreux cadres, le service sera résilié avecshutdownNow()
.OriginalL'auteur Philipp