2013-04-09 15 views
12
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. 

Ecco run metodo della classe esecutore:Come interrompere tutto il thread eseguibile nella classe java executor?

public void run() { 
try { 
    Thread.sleep(20 * 1000); 
} catch (InterruptedException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
}} 

Qui è in attesa di 20 secondi, ma quando ho eseguito il codice viene generata un'eccezione:

java.lang.InterruptedException: sleep interrupted 
at java.lang.Thread.sleep(Native Method) 

io non sono in grado di chiudere il thread simultaneo che si rovina in Java Executor class. Qui è il mio flusso Codice:

  • Creato un nuovo thread con Java di classe esecutore di eseguire qualche compito cioè scritto in MyRunnable
  • executor attesa per 10 secondi per completare le attività.
  • Se l'attività è stata completata, il thread eseguibile è stato terminato.
  • Se l'attività non viene completata entro 10 secondi, la classe executor deve terminare il thread.

Tutto funziona bene tranne la conclusione di attività nell'ultimo scenario. Come dovrei farlo?

+0

possibile duplicato di [Java: arresto forzato dei thread ExecutorService] (http://stackoverflow.com/questions/5946562/java-force-stopping-of-executorservice-threads) – Perception

risposta

12

Il metodo shutDown() impedisce semplicemente l'esecuzione di attività aggiuntive. Invece, è possibile chiamare shutDownNow() e verificare l'interruzione del thread nel proprio Runnable.

// in your Runnable... 
if (Thread.interrupted()) { 
    // Executor has probably asked us to stop 
} 

Un esempio, in base al codice, potrebbe essere:

final ExecutorService executor = Executors.newFixedThreadPool(1); 
executor.submit(new Runnable() { 
    public void run() { 
    try { 
     Thread.sleep(20 * 1000); 
    } catch (InterruptedException e) { 
     System.out.println("Interrupted, so exiting."); 
    } 
    } 
}); 

if (executor.awaitTermination(10, TimeUnit.SECONDS)) { 
    System.out.println("task completed"); 
} else { 
    System.out.println("Forcing shutdown..."); 
    executor.shutdownNow(); 
} 
+0

Vedere il metodo di esecuzione in questione. L'ho provato ma ho lanciato un'eccezione –

+0

Vedere la mia modifica sopra. Questo esempio di codice attenderà per dieci secondi, quindi imporrà uno spegnimento. –

+0

@Ducan Esattamente lo ho provato con il codice precedente ma getta un'eccezione che ho scritto nella mia domanda –

1

E 'generalmente una cattiva idea di terminare un thread in esecuzione dall'esterno, perché non si conosce lo stato del filo è attualmente disponibile. È possibile che sia necessario eseguire alcune operazioni di pulizia e non sarà in grado di farlo quando lo si chiude forzatamente. That's why all methods of Thread which do that are marked as deprecated.

È molto meglio utilizzare una delle numerose tecniche disponibili per la comunicazione tra processi per segnalare la procedura in esecuzione nel thread stesso che deve interrompere il proprio lavoro ed uscire normalmente. Un modo per farlo è aggiungere un metodo abort() alla tua eseguibile, che solleva un flag dichiarato come volatile. Il loop interno del Runnable controlla che il flag e esca (in modo controllato) quando viene sollevato quel flag.

+0

Ero solo per dirlo. Questo è il motivo per cui Thread.stop() è depredato: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#stop() – CodeChimp

+5

Nel caso specifico di un ' ExecutorService', voterei per supportare l'interruzione del thread piuttosto che una flag.In molti framework, il servizio verrà terminato con 'shutdownNow()'. –

Problemi correlati