Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21

Discussione: Stoppare un thread

  1. #1

    Stoppare un thread

    ciao a tutti.
    ho una domanda da fare sui thread.
    io ho questo:
    codice:
    package contocorrente;
    
    public class Banca2 {
    
        private int saldo;
    
        public Banca2(int saldo) {
            this.saldo = saldo;
        }
    
        synchronized public void operazione(int s) {
            if (saldo + s < 0) {
                System.out.println("Impossibile effettuare l'addebito " + s + " perchè il saldo è " + saldo);
            } else {
                saldo += s;
                System.out.println("Modifica di " + s + " effettuata, Il tuo saldo è: " + saldo);
                try {
                    Thread.sleep(2000);
                } catch (Exception e) {
                    System.out.println("Errore " + e.getMessage());
                }
            }
        }
    }
    
    class Modifica implements Runnable {
    
        Banca2 banca;
        int modifica;
    
        public Modifica(Banca2 banca, int modifica) {
            this.banca = banca;
            this.modifica = modifica;
            new Thread(this).start();
        }
    
        public void run() {
            banca.operazione(modifica);
        }
    }
    che viene richiamato dal main così:
    codice:
    package contocorrente;
    
    public class Main {
    
        public static void main(String[] args) {
    
    
            Banca2 banca2 = new Banca2(0);
             new Modifica(banca2, 500);
             new Modifica(banca2, 300);
             new Modifica(banca2, -3000);
             new Modifica(banca2, 700);
        }
    }
    io vorrei che se il saldo va sotto lo zero il processo si blocchi.
    in aula nn affronteremo questo discorso perchè troppo lungo/complicato per il corso che sto facendo.
    voi sapreste aiutarmi?'

  2. #2
    Utente di HTML.it L'avatar di tridi9
    Registrato dal
    Apr 2002
    Messaggi
    346
    Pero' non va mai sotto zero.
    Questo è il tuo output

    Modifica di 500 effettuata, Il tuo saldo è: 500
    Modifica di 700 effettuata, Il tuo saldo è: 1200
    Impossibile effettuare l'addebito -3000 perchè il saldo è 1200
    Modifica di 300 effettuata, Il tuo saldo è: 1500

    ........‘’’........
    .......(o o).......
    ----ooO-(_)-Ooo----

  3. #3
    Si intendevo dire che si doveva stoppare quando si verificava quell'errore.
    Nn va sotto lo zero perchè nell'if gli ho impostato di nn fare operazioni ma solo di stampare quel messaggio.
    A me interessa che se si verifica che l'operazione nn puo essere fatta il thread si blocca.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da fermat
    Si intendevo dire che si doveva stoppare quando si verificava quell'errore.
    Nn va sotto lo zero perchè nell'if gli ho impostato di nn fare operazioni ma solo di stampare quel messaggio.
    A me interessa che se si verifica che l'operazione nn puo essere fatta il thread si blocca.
    Da Java 1.5 sono stati deprecati i metodi pause() e stop(). Il metodo moderno consiste nell'utilizzare wait() e notify() e una variabile booleana.

    Avevo postato questo, guarda il mio post (fine pagina).

    http://forum.html.it/forum/showthrea...readid=1408782


    (ovviamente per te non vale ciò che ho detto su Timer (di Swing), dato che non utilizzi Swing).

  5. #5
    ho dato una letta a quello che hai scritto e ho cercato di fare qualche modifica:
    codice:
    package contocorrente;
    
    public class Banca2 {
    
        private int saldo;
        private boolean sospendi = false;
    
        public Banca2(int saldo) {
            this.saldo = saldo;
        }
    
        synchronized public void operazione(int s) {
            if (saldo + s < 0) {
                System.out.println("Impossibile effettuare l'addebito " + s);
                sospendi();
    
            } else {
                saldo += s;
                System.out.println("Modifica di " + s + " effettuata, Il tuo saldo è: " + saldo);
                try {
                    Thread.sleep(2000);
                } catch (Exception e) {
                    System.out.println("Errore " + e.getMessage());
                }
            }
        }
    
        synchronized public void sospendi() {
            sospendi = true;
        }
    }
    
    class Modifica implements Runnable {
    
        Banca2 banca;
        int modifica;
    
        public Modifica(Banca2 banca, int modifica) {
            this.banca = banca;
            this.modifica = modifica;
            new Thread(this).start();
        }
    
        public void run() {
            banca.operazione(modifica);
        }
    }
    ho aggiunto una variabile booleana all'inizio settata su false.
    ho creato un metodo sospendi settando la variabile su true.
    e nell'if ho richiamato il metodo.
    però nn ha funzionato.
    probabilmente ho sbagliato qualcosa o mi manca qualcosa.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Eh si.. dove usi wait() ?

    Metti questo in run()

    codice:
    synchronized(this) {
      while(sospendi) {
        wait();
      }
    }
    (se non funziona, al posto del this passa l'oggetto modifica).

  7. #7
    lasciando (this) mi da come errore:
    codice:
    cannot find symbol
    symbol  : variable sospendi
    location: class contocorrente.Modifica
                while (sospendi) {
    ho provato a modificare così:
    codice:
        public void run() {
    
            synchronized (this) {
    //            banca.operazione(modifica);
                while (sospendi) {
                    banca.operazione(modifica);
                    wait();
                }
            }
        }
    con lo stesso errore, e così:
    codice:
        public void run() {
    
            synchronized (modifica) {
    //            banca.operazione(modifica);
                while (sospendi) {
                    banca.operazione(modifica);
                    wait();
                }
            }
        }
    con il seguente errore:
    codice:
    unexpected type
    found   : int
    required: reference
            synchronized (modifica) {
    ...
    cannot find symbol
    symbol  : variable sospendi
    location: class contocorrente.Modifica
                while (sospendi) {

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Usa il primo che ti ho messo io!
    Ovviamente non trova la variabile booleana! Dichiarala in quel codice e poi passala all'altra classe (al costruttore di Modifica), così è presente anche di la!

  9. #9
    allora ho fatto così:
    codice:
    package contocorrente;
    
    public class Banca2 {
    
        private int saldo;
        private boolean sospendi = false;
    
        public Banca2(int saldo) {
            this.saldo = saldo;
        }
    
        synchronized public void operazione(int s) {
            if (saldo + s < 0) {
                System.out.println("Impossibile effettuare l'addebito " + s);
                sospendi();
    
            } else {
                saldo += s;
                System.out.println("Modifica di " + s + " effettuata, Il tuo saldo è: " + saldo);
                try {
                    Thread.sleep(2000);
                } catch (Exception e) {
                    System.out.println("Errore " + e.getMessage());
                }
            }
        }
    
        synchronized public void sospendi() {
            sospendi = true;
        }
    }
    
    class Modifica implements Runnable {
    
        Banca2 banca;
        int modifica;
        boolean sospendi;
    
        public Modifica(Banca2 banca, int modifica, boolean sospendi) {
            this.banca = banca;
            this.modifica = modifica;
            this.sospendi = sospendi;
            new Thread(this).start();
        }
    
        public void run() {
            boolean sospendi = false;
    
            synchronized (this) {
                banca.operazione(modifica);
                while (sospendi) {
                    wait();
                }
            }
        }
    }
    ho ancora un piccolo errore sul wait():
    codice:
    unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
                    wait();

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    ho ancora un piccolo errore sul wait():
    codice:

    codice:
    unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
                    wait();
    Si hai ragione, me ne ero scordato
    Devi racchiudere il codice dove c'è il wait() con

    codice:
    try {
      // Qui il codice, wait() compreso
    } catch(InterruptedException ex) {}

    Se dovessi avere problemi (ad esempio non si stoppa o cose di questo tipo), è colpa della variabile boolean. In quel modo ho proprio paura non possa far nulla.. penso proprio ti convenga portare il metodo sospendi() nella classe del metodo run().

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.