L'avenir.la méthode cancel() ne fonctionne pas
Le code que j'ai crée une instance Appelable et à l'aide de ExecutorService un nouveau thread est créé. Je veux tuer ce fil après un certain temps si le fil n'est pas fait à son exécution. Après être passé par le jdk de la documentation que j'ai réalisé que l'Avenir.la méthode cancel() peut être utilisée pour arrêter l'exécution du thread, mais à mon grand désarroi sa ne fonctionne pas. Bien sûr avenir.méthode get() envoie une interruption au Fil après le délai prévu (dans mon cas 2 secondes) et même le thread de réception de cette interruption, mais cette interruption a lieu seulement une fois que le fil est fait de son exécution complète. Mais je veux tuer le fil au bout de 2 secondes.
Quelqu'un pourrait-il m'aider à atteindre cet objectif.
Testclass code:
====================================
public class TestExecService {
public static void main(String[] args) {
//checkFixedThreadPool();
checkCallablePool();
}
private static void checkCallablePool()
{
PrintCallableTask task1 = new PrintCallableTask("thread1");
ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
Future<String> future = threadExecutor.submit(task1);
try {
System.out.println("Started..");
System.out.println("Return VAL from thread ===>>>>>" + future.get(2, TimeUnit.SECONDS));
System.out.println("Finished!");
}
catch (InterruptedException e)
{
System.out.println("Thread got Interrupted Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
//e.printStackTrace();
}
catch (ExecutionException e)
{
System.out.println("Thread got Execution Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
}
catch (TimeoutException e)
{
System.out.println("Thread got TimedOut Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
future.cancel(true);
}
threadExecutor.shutdownNow();
}
}
Appelable code de Classe:
===================================================================
package com.test;
import java.util.concurrent.Callable;
public class PrintCallableTask implements Callable<String> {
private int sleepTime;
private String threadName;
public PrintCallableTask(String name)
{
threadName = name;
sleepTime = 100000;
}
@Override
public String call() throws Exception {
try {
System.out.printf("%s going to sleep for %d milliseconds.\n", threadName, sleepTime);
int i = 0;
while (i < 100000)
{
System.out.println(i++);
}
Thread.sleep(sleepTime); //put thread to sleep
System.out.printf("%s is in middle of execution \n", threadName);
} catch (InterruptedException exception) {
exception.printStackTrace();
}
System.out.printf("%s done sleeping\n", threadName);
return "success";
}
}
OriginalL'auteur Ismail Shaik | 2012-11-29
Vous devez vous connecter pour publier un commentaire.
Votre code fait tout droit. Le seul problème, c'est que vous n'êtes pas vérifier
Thread.isInterrupted
dans lewhile
boucle. La seule façon de thread pour obtenir le message est d'arriver à l'appel de blocageThread.sleep
qui se jettent immédiatementInterruptedException
.Si la boucle est longue, il peut prendre un certain temps. C'est exactement pourquoi votre code est un peu instable.
Vérifier l'interruption d'état, disons, tous les 10 000 itérations:
InterruptedException
est longue de blocage des méthodes.Thread.isInterrupted
est pour tout le reste.OriginalL'auteur
cancel()
appelle justeinterrupt()
pour déjà en cours d'exécution du thread.http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html:
Filet interrompu jeter InterruptedException seulement
De sorte que vous besoin de faire explicitement code du travail dans l'exécution du thread courant de la possible interruption.
Voir aussi Qui est appel Java Thread de l'interruption() méthode si je ne suis pas?.
Voir aussi Comment annuler Java 8 complétées à l'avenir? que java terme mûri seulement par Java 8.
Future.cancel
ne mène pas toujours àThread.interrupt
.N'avez-vous pas d'avis "pour déjà en cours d'exécution"? Cela signifie déjà commencé une tâche en question. Voir la source: grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/...
OriginalL'auteur Vadzim