Thread

di il
9 risposte

Thread

Premetto che ho appena iniziato ad utilizzare i thread quindi mi reputo un neofita.
In università mi hanno assegnato questo "semplice" esercizio basato sui thread:

Creare un’applicazione con due thread figli. Ciascuno dei due thread ha associato un simbolo (ad es. * o #). Sovrascrivere il metodo run() in modo che ciascun thread stampa continuamente a video il proprio simbolo, andando a capo ogni 50 simboli stampati.

Di seguito pubblico il mio codice:

class Worker extends Thread
{
public void run() {
System.out.println("#");
}
}

class Seconda extends Thread
{
public void run() {
System.out.println("*");
}
}

public class First
{
public static void main(String args[]) {
int contatore=0;
Worker prova = new Worker();
Seconda prova2 = new Seconda();
for(;;) {
prova.start();
prova2.start();
contatore=contatore+2;
if(contatore==50) System.out.println("");
}

}
}

Prima di tutto mi da l'errore java.lang.IllegalThreadStateException che non ho capito cosa riguardi, e in secondo non riesco a capire cosa si intenda per "sovrascrivere il metodo run()".
Ringrazio anticipatamente chiunque mi aiuti rispondendomi.

9 Risposte

  • Re: Thread

    AntoninoRusso ha scritto:


    Prima di tutto mi da l'errore java.lang.IllegalThreadStateException che non ho capito cosa riguardi
    Innanzitutto un thread può essere avviato una volta sola, ovvero puoi fare prova.start(); soltanto una volta. Anche quando il thread termina (ovvero il suo run finisce), comunque non si può riavviare quello stesso oggetto Thread. Bisognerebbe creare una nuova istanza di Thread (ovvero nel tuo caso di Worker).

    Il for(;;) in ogni caso è dubbio e direi inutile. E pure il fatto di gestire il contatore a max 50 nel main è dubbio.
    Quando avvii i due thread, essi vengono eseguiti con tempistiche "arbitrarie" e possono essere intervallati in qualunque modo.
    L'output quindi potrebbe essere:

    ***#**#****#* .....
    oppure
    ###**#***
    oppure
    #**###**##
    ecc......

    Insomma, qualunque combinazione. Quindi la domanda è: vuoi che ciascun thread faccia andare a capo ogni suoi 50 simboli ..... o vuoi che si vada a capo comunque ogni 50 qualunque simboli?

    Nel primo caso è facile/banale (perché è nel singolo thread). Nel secondo è più complicato, perché ci vuole una "coordinazione" tra i thread, che non puoi fare banalmente nel main come stavi pensando/cercando di fare.

    AntoninoRusso ha scritto:


    e in secondo non riesco a capire cosa si intenda per "sovrascrivere il metodo run()".
    Significa fare il "override" di un metodo. Il tuo run() in Worker/Seconda fa il override (sovrascrive) il run() definito in java.lang.Thread.
    P.S. Dovresti già avere i concetti di override/overload se arrivi ai thread ....
  • Re: Thread

    Wollàà!
    
    class Worker extends Thread
    {
        public void run() 
        {
            //ciclo infinito che stampa il proprio simbolo
            while(true)
            {
                try
                {
                    System.out.println("#");
                    Thread.sleep(100);
                }
                catch(Exception e){}
            }
            
        }
    }
    
    class Seconda extends Thread
    {
        public void run() 
        {
            //ciclo infinito che stampa il proprio simbolo
            while(true)
            {
                try
                {
                    System.out.println("*");
                    Thread.sleep(100);
                }
                catch(Exception e){}
            }
        }
    }
    
    public class First
    {
        public static void main(String args[]) 
        {
            int contatore=0;
            Worker prova = new Worker();
            Seconda prova2 = new Seconda();
            
            prova.start();
            prova2.start();
            
            //50 x 100 = 5000 ms = 5 secondi...
            for(contatore=0;contatore<50;contatore++) 
            {
                //nn puoi continuare a farlo ripartire.!!!!!
                //i thread sono processi indipendenti..la stampa e la loro ciclicità è al loro interno!!
                
                //prova.start();
                //prova2.start();
                //contatore=contatore+2;
                
                //if(contatore==50) 
                
                //x evitare che il programma vada all infinito...
                try
                {
                    Thread.sleep(100);
                    System.out.println("contatore: "+contatore);
                }
                catch(Exception e){}
                
            }
    
            prova.stop();
            prova2.stop();
        }
    }
    
  • Re: Thread

    Un'altra regoletta che conviene imparare fin da subito e' la seguente:

    MAI derivare dalla classe Thread, ma sempre e solo implementare l'interfaccia Runnable

    e passare l'oggetto che implementa tale interfaccia al costruttore della classe Thread.

    Perche'? E' una di quelle regole non scritte di buona programmazione, che ha effetti collaterali estremamente positiivi ad esempio quando se devi utilizzare dei thread pool o qualche altra strategia di esecuzione concorrente.
  • Re: Thread

    elle0087 ha scritto:


    wollàà!
    wollàà un bel niente, mi spiace ...
    Innanzitutto non hai ancora gestito il "andare a capo ogni 50 simboli". In ogni caso non è dal main che puoi farlo. Perché ripeto che i thread hanno tempistiche assolutamente arbitrarie.

    E infine: mai usare stop() sul thread. stop() è un metodo deprecato, non deve mai essere usato.
  • Re: Thread

    Bè calmi...
    il problema originario è che nn riusciva a farlo partire...poi il resto farà lui.!
    (mica si risolvono i compiti qua, si aiuta a risolvere i problemi mi pare...)
    cmq x ogni thread basta mettere la condizione di taglio x 50 simboli, se ho nn ho capito male...
  • Re: Thread

    elle0087 ha scritto:


    bè calmi...
    il problema originario è che nn riusciva a farlo partire...poi il resto farà lui.!
    Io son calmo ..... solo che ho risposto così in fretta che non ho prestato attenzione al fatto che hai risposto tu elle0087 e non AntoninoRusso. ;P
    Sorry ....

    elle0087 ha scritto:


    cmq x ogni thread basta mettere la condizione di taglio x 50 simboli, se ho nn ho capito male...
    Se ciascun thread deve far andare a capo ogni 50 suoi simboli, allora è molto facile e banale. Se bisogna fare in modo che si vada a capo ogni 50, qualunque siano, simboli ..... no, è più difficile e richiede un "coordinamento" tra i thread (=sincronizzazione).
    E ripeto: non può essere fatto nel main.
  • Re: Thread

    Grazie per la disponibilità! comunque andbin l'output ritorna a capo quando vengono scritti i 50 simboli del thread.
    Purtroppo in università ho due lezioni distinte: in "programmazione ad oggetti" stiamo facendo programmazione in java (stiamo iniziando ora la creazione di nuove classi) e in "sistemi operativi" stiamo facendo queste cose qui anche se nel corso vero e proprio di java non ci siamo ancora arrivati.
    Diciamo che è soprattutto per questo motivo che sto riscontrando difficoltà e se qualcuno sarebbe gentile a chiarirmi i dubbi gliene sarei molto grato

    Il primo problema che non ho capito è come creare ogni volta nuove istanze di Thread per poterlo riavviare, ed in secondo come appunto eseguire l'override di un metodo.

    Scusatemi ma ho iniziato da circa 1 mesetto java quindi sono molto inesperto.
  • Re: Thread

    AntoninoRusso ha scritto:


    Il primo problema che non ho capito è come creare ogni volta nuove istanze di Thread per poterlo riavviare
    Non devi creare più istanze del tuo es. Worker per poter avviare più thread. Non è sicuramente questo l'obiettivo che ti viene richiesto.
    È all'interno di un thread che ci deve essere il ciclo per stampare tante volte il simbolo (vedi abbozzo di elle0087)

    AntoninoRusso ha scritto:


    ed in secondo come appunto eseguire l'override di un metodo.
    Hai materiale di studio sulla programmazione ad oggetti? E in particolare su override/overload? Non puoi, scusa se lo dico, arrivare ai thread ed avere lacune palesi su questi argomenti ....

    Comunque quello che hai fatto è già un override, ovvero il public void run() che hai messo in Worker/Seconda è tale per cui fa l'override (sovrascrive) il run definito in java.lang.Thread.
  • Re: Thread

    Ciao andbin,
    scuse accettate e mi scuso anch io x la fretta con cui avevo risposto (al lavoro =P).

    cmq confermo quello detto da te..prima dei thread, bisogna capire bene le basi.!
Devi accedere o registrarti per scrivere nel forum
9 risposte