Thread metodo stop e interrupt!

di il
9 risposte

Thread metodo stop e interrupt!

Sarò breve. Ho scritto un semplice programma costituito da 2 thread ( compreso il thread main ). Il mio obiettivo è quello di terminare il secondo thread dopo un certo periodo di tempo. Essendo il metodo stop deprecato ho utilizzato il metodo interrupt , il problema è che il thread continua ad compiere attività mentre se utilizzo il metodo stop il thread termina correttamente come da obbiettivo. Perchè?

9 Risposte

  • Re: Thread metodo stop e interrupt!

    ezio1400 ha scritto:


    Sarò breve. Ho scritto un semplice programma costituito da 2 thread ( compreso il thread main ). Il mio obiettivo è quello di terminare il secondo thread dopo un certo periodo di tempo. Essendo il metodo stop deprecato ho utilizzato il metodo interrupt , il problema è che il thread continua ad compiere attività mentre se utilizzo il metodo stop il thread termina correttamente come da obbiettivo. Perchè?
    stop(), suspend() e alcuni altri sono deprecati ormai da molto tempo e per motivi ben precisi (info qui).

    La terminazione dei thread deve essere fatta in modo "cooperativo", nel senso che il codice del thread deve cooperare in modo che ci sia l'opportunità di terminarlo ma nei tempi e modi appropriati per il lavoro che sta svolgendo.

    interrupt() di per sé non interrompe un bel niente ... setta solo un flag della interruzione e basta. Se il lavoro del thread è fatto solo di computazioni, cicli, calcoli, ecc... non succede proprio nulla.
    Dovrebbe essere appunto il codice del thread a cooperare andando di tanto in tanto a verificare se è stato interrotto e se sì, ha la facoltà di terminare facendo in modo da chiudere/rilasciare perlomeno correttamente ciò che stava facendo/usando.

    Se invece il thread è bloccato in una qualche operazione "bloccante" (es. una wait() ) allora la JVM è in grado di reagire. Vedi la documentazione di interrupt() che spiega chiaramente quali sono questi casi.
  • Re: Thread metodo stop e interrupt!

    Ma quindi come posso terminare un thread utilizzando il metodo interrupt?
    Io ho pensato che se il mio thread esegue un'istruzione ciclica controllo il flag di interruzione se questo è uguale a true( cioè il main ha ha interrotto il thread ) allora eseguo l'istruzione break uscendo dal ciclo.
    Se il thread non esegue una istruzione ciclica come posso implementare il codice del thread in modo tale che alla chiamata del metodo interrupt il thread si termini? Oppure in questo caso non serve a niente il metodo interrupt e c'è qualche altra strada da percorrere?
  • Re: Thread metodo stop e interrupt!

    ezio1400 ha scritto:


    Ma quindi come posso terminare un thread utilizzando il metodo interrupt?
    Dipende da cosa fa il codice del thread che si vuole sospendere. Per questo si dice che, appunto, deve "cooperare". Solo chi ha scritto il codice del thread sa cosa fa, quali risorse usa e quali sono i punti "tranquilli" in cui è appropriato e accettabile sospendere o terminare il lavoro.

    ezio1400 ha scritto:


    Io ho pensato che se il mio thread esegue un'istruzione ciclica controllo il flag di interruzione se questo è uguale a true( cioè il main ha ha interrotto il thread ) allora eseguo l'istruzione break uscendo dal ciclo.
    Se il thread fa solo computazioni (qualunque istruzione che non coinvolge I/O o operazioni "bloccanti"), allora deve appunto essere il codice a testare il flag di interrupt ed agire di conseguenza.

    ezio1400 ha scritto:


    Se il thread non esegue una istruzione ciclica come posso implementare il codice del thread in modo tale che alla chiamata del metodo interrupt il thread si termini?
    Ripeto che dipende da cosa fa il thread! Se in un certo momento è in sospensione (e ci possono essere svariati motivi), la JVM può anche reagire al interrupt.
    La documentazione di descrive i vari casi.
  • Re: Thread metodo stop e interrupt!

    Ripeto che dipende da cosa fa il thread! Se in un certo momento è in sospensione (e ci possono essere svariati motivi), la JVM può anche reagire al interrupt.
    La documentazione di descrive i vari casi.[/quote]

    Ma quindi se il thread non ha un momento in cui e sospeso non è possibile utilizzare interrupt?
  • Re: Thread metodo stop e interrupt!

    ezio1400 ha scritto:


    Ma quindi se il thread non ha un momento in cui e sospeso non è possibile utilizzare interrupt?
    Certo che è possibile. Lo ripeto: se sta solo facendo computazioni lunghe che impiegano molto tempo, è il codice del thread che deve testare la condizione del interrupt, che come ti ho già detto è solo un "flag".
  • Re: Thread metodo stop e interrupt!

    Ok, prova questo:
    import java.math.BigInteger;
    import javax.swing.*;
    
    public class ProvaInterruzione {
        public static void main(String[] args) {
            FattorialeRunnable r = new FattorialeRunnable();
            final Thread t = new Thread(r);
    
            t.start();
            System.out.println("---avviato---");
    
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JOptionPane.showMessageDialog(null, "Premi ok per terminare il thread");
                    t.interrupt();
                }
            });
    
            try {
                t.join();
            } catch (InterruptedException ie) {}
            System.out.println("---terminato---");
        }
    }
    
    
    class FattorialeRunnable implements Runnable {
        public void run() {
            for (int n = 0; n < 100000; n++) {
                BigInteger bi = fattoriale(n);
                boolean interrotto = Thread.currentThread().isInterrupted();
                System.out.print(interrotto ? "[I] " : "    ");
                System.out.println("Calcolato fattoriale " + n + "!");
    
                if (interrotto) {
                    break;
                }
            }
        }
    
        private static BigInteger fattoriale(int n) {
            BigInteger f = BigInteger.ONE;
    
            for (int i = 1; i <= n; i++) {
                f = f.multiply(BigInteger.valueOf(i));
            }
    
            return f;
        }
    }
    Prova anche ad eseguirlo togliendo (commentando) quel break nel if. Vedrai che se lo interrompi, il thread "vede" la interruzione (vedi tutti [I] a inizio riga) ma NON termina un bel niente.
  • Re: Thread metodo stop e interrupt!

    Quell'attività viene eseguita ciclicamente quindi posso controllare ciclicamente lo stato del mio flag e fare qualcosa nel caso in cui sia == TRUE. Ma non è il caso che ho richiesto.

    Mettiamo questa situazione. Il thread main crea un nuovo thread e lo fa partire. Questo thread main aspetta un tot di tempo. Finito il tempo controlla se il thread è ancora in esecuzione. Se non lo è non fa nulla se invece sta ancora eseguendo qualcosa lo si deve terminare. Ora mettiamo che il thread da terminare abbia un metodo run implementato con un codice senza cicli ma composto da una serie di istruzioni che non si ripetono. Ora o tra un'istruzione e l'altra posiziono CASUALMENTE nel codice un'istruzione di controllo del flag oppure non saprei come agire usando interrupt.
  • Re: Thread metodo stop e interrupt!

    ezio1400 ha scritto:


    Ora mettiamo che il thread da terminare abbia un metodo run implementato con un codice senza cicli ma composto da una serie di istruzioni che non si ripetono. Ora o tra un'istruzione e l'altra posiziono CASUALMENTE nel codice un'istruzione di controllo del flag oppure non saprei come agire usando interrupt.
    Ovviamente non "casualmente" .... ma nei punti che risultano più sensati/appropriati per affrontare la terminazione.
    Chiaramente la densità/quantità di questi punti di controllo della interruzione, lo devi stabilire tu che scrivi il codice del thread, sapendo cosa fanno le operazioni e quanto impiegano.
    Se due istruzioni di fila (es. println su console o file) impiegano in tutto 0,01 secondi, non credo abbia molto senso infilarci in mezzo un test della interruzione!

    La granularità dei controlli e la responsività alla interruzione che ne deriva li devi valutare TU.
  • Re: Thread metodo stop e interrupt!

    Ok va bene ho capito. Grazie mille per le risposte
Devi accedere o registrarti per scrivere nel forum
9 risposte