Java: come interrompere il thread?

C’è un modo per fermare un altro thread da ESTERNO del thread? Ad esempio, se eseguo un thread per eseguire quel thread e ho causato il blocco di quel thread? Fermerebbe l’altro thread?

C’è un modo per fermare il thread dall’interno senza un loop? Ad esempio, se si sta scaricando idealmente, si vorrebbe utilizzare un ciclo e, se utilizzo un ciclo, non riuscirò a metterlo in pausa finché non raggiunge la fine del ciclo.

Puoi creare un campo booleano e controllarlo all’interno dell’esecuzione:

public class Task implements Runnable { private volatile boolean isRunning = true; public void run() { while (isRunning) { //do work } } public void kill() { isRunning = false; } } 

Per fermarlo basta chiamare

 task.kill(); 

Questo dovrebbe funzionare.

Non interrompiamo o uccidiamo una discussione, piuttosto facciamo Thread.currentThread().isInterrupted().

 public class Task1 implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { ................ ................ ................ ................ } } } 

in main faremo così:

 Thread t1 = new Thread(new Task1()); t1.start(); t1.interrupt(); 

Un modo ansible è di fare qualcosa del genere:

 public class MyThread extends Thread { @Override public void run() { while (!this.isInterrupted()) { // } } } 

E quando vuoi interrompere il thread, chiama semplicemente un metodo interrupt ():

 myThread.interrupt(); 

Ovviamente, questo non interromperà il thread immediatamente, ma nella seguente iterazione del ciclo sopra. In caso di download, è necessario scrivere un codice non bloccante . Significa che tenterai di leggere i nuovi dati dal socket solo per un periodo di tempo limitato. Se non ci sono dati disponibili, continuerà semplicemente. Si può fare usando questo metodo dalla class Socket:

 mySocket.setSoTimeout(50); 

In questo caso, il timeout è impostato su 50 ms. Una volta trascorso questo tempo e non è stato letto alcun dato, viene generata una SocketTimeoutException. In questo modo, puoi scrivere thread iterativi e non bloccanti, che possono essere uccisi usando la costruzione di cui sopra.

Non è ansible uccidere thread in nessun altro modo e devi implementare questo comportamento tu stesso. In passato, Thread aveva un metodo (non sicuro se kill () o stop ()) per questo, ma ora è deprecato. La mia esperienza è che alcune implementazioni di JVM non contengono nemmeno quel metodo al momento.

Il modo consigliato sarà quello di build questo nel thread. Quindi no non puoi (o meglio non dovresti) uccidere il thread dall’esterno.

Fare controllare raramente il thread se è necessario fermarsi. (Invece di bloccare su un socket fino a quando non ci sono dati. Utilizzare un timeout e ogni tanto controllare se l’utente ha indicato di voler interrompere)

La raccomandazione di JavaSun consiste nell’utilizzare una variabile condivisa come un flag che richiede l’interruzione del thread in background. Questa variabile può quindi essere impostata da un object diverso che richiede la terminazione del thread.

In questo modo puoi uccidere l’altro processo e quello successivo in seguito.