Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [JAVA] Thread: non capisco output di esempio

    Salve,

    Non capisco la successione dell'output del seguente esempio (che ho semplificato per brevità):

    Codice PHP:
    public class ThreadTester {
       public static 
    void mainString args[] )
       {
          
    PrintThread thread1thread2;

          
    thread1 = new PrintThread"thread1" );
          
    thread2 = new PrintThread"thread2" );
         
          
    System.err.println"\nStarting threads" );

          
    thread1.start();
          
    thread2.start();
         
          
    System.err.println"Threads started\n" );
       }
    }

    class 
    PrintThread extends Thread {
       private 
    int sleepTime;

       public 
    PrintThreadString name )
       {
          
    supername );

          
    sleepTime 2;

          
    System.err.println"Name: " getName() +
                              
    ";  sleep: " sleepTime );
       }

       public 
    void run()
       {
          try {
             
    System.err.printlngetName() + " going to sleep" );
             
    Thread.sleepsleepTime );
          }
          catch ( 
    InterruptedException exception ) {
             
    System.err.printlnexception.toString() );
          }

          
    System.err.printlngetName() + " done sleeping" );
       }

    Ecco l'output:
    Name: thread1; sleep: 2
    Name: thread2; sleep: 2

    Starting threads
    Threads started

    thread1 going to sleep
    thread2 going to sleep
    thread1 done sleeping
    thread2 done sleeping
    Perchè la stringa Threads started non sta alla fine?

    Grazie dell'attenzione.
    Matteo
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Thread: non capisco output di esempio

    Originariamente inviato da matthew80
    Perchè la stringa Threads started non sta alla fine?
    Perché quando invochi start() su un Thread, viene creato un nuovo "thread di esecuzione" che si fa carico di eseguire il metodo run(). Il metodo start() avvia il thread e ritorna praticamente subito.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    andbin il nostro ormai è un epistolario

    Cmq per la tua gioia non ho ben capito.

    Mi spiego meglio...
    Io avevo capito:
    [list=1][*]Una volta creato un Thread viene chiamato il costruttore relativo che mi stampa dei messaggi informativi, e fin qui tutto ok.[*]Poi viene stampata la scritta Starting threads e fin qui tutto ok.[*]Il metodo start chiama il metodo run del relativo thread che stampa delle scirtte informative.[*]Viene stampata la scritta Threads started[/list=1]

    Se ho capito bene la risposta da te data precedentemente è come se la chiamata al metodo start -> run del thread impieghi un certo tempo e mentre non viene effettuato quel compito nel frattempo il programma principale va avanti stampando la scritta Threads started per poi ritornare al compito precedente, cioè la scritta thread1 going to sleep, ecc

    Quindi la successione è quella che è per i seguenti passaggi:
    [list=1][*]Una volta creato un Thread viene chiamato il costruttore relativo che mi stampa dei messaggi informativi.[*]Poi viene stampata la scritta Starting threads.[*]Il metodo start chiama il metodo run del relativo thread aprendo un nuovo thread che impiegherà un certo tempo.[*]Senza aspettare la conclusione del thread precedente si va avanti con le istruzioni, e cioè la stampa della stringa Threads started.[*]Il thread completa la sua esecuzione precedentemente lasciata in sospeso.[/list=1]

    E' così? Sento che ci sta qualcosa che nn ho cmq afferrato

    PS: Perchè un System.err e non un System.out? Mica ci sono errori?
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da matthew80 [*]Il metodo start chiama il metodo run del relativo thread che stampa delle scirtte informative.
    No non è una "banale" chiamata di un metodo. Cioè start() non chiama direttamente run()!!!

    Quello che ti manca è il concetto di "thread" (non la classe Thread). Un thread è una sequenza di operazioni eseguita in parallelo ad altri thread. È come se su una strada a 3 corsie ci fossero 3 auto che viaggiano ognuna per conto proprio nella sua corsia.

    Il concetto di "thread" è correlato al concetto di "processo". La differenza sta nel modo in cui condividono le risorse del sistema. Ogni processo è completamente slegato dagli altri, ognuno ha il suo spazio di indirizzamento, i suoi "handle" alle risorse, ecc...
    Ogni processo può avere più thread (in effetti ne ha almeno uno, cioè sé stesso) i quali condividono lo stesso spazio di indirizzamento del processo, le stesse variabili globali, handle ecc....
    Qui sto parlando in generale, non necessariamente solo per Java.

    I thread devi vederli come dei "flussi" di esecuzione che vengono eseguiti in parallelo contemporaneamente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Per brevità ho detto che start chiama il metodo run, ma sarebbe stato più corretto - almeno spero - se avessi detto che la chiamata al metodo start implica che il thread attuale si trova nello stato di "ready" e quindi pronto ad essere eseguito, ovvero ad eseguire il relativo metodo run.
    Andando avanti nella lettura del capitolo sui thread e rileggendo la tua risposta (in particolar modo l'esempio delle corsie autostradali ) ho capito meglio quell'esempio. Devo dire però che mi capita di rileggere più volte lo stesso paragrafo per capire veramente il capitolo sui thread
    Non so se son tonto io, ma sti thread non si sembrano proprio semplicissimi.

    Cmq vedo che sei certificato Sun, complimenti!
    Da che libro hai studiato?
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da matthew80
    Per brevità ho detto che start chiama il metodo run, ma sarebbe stato più corretto - almeno spero - se avessi detto che la chiamata al metodo start implica che il thread attuale si trova nello stato di "ready" e quindi pronto ad essere eseguito, ovvero ad eseguire il relativo metodo run.
    Infatti. Chiamando start() l'unica cosa che succede è che viene creato un nuovo thread messo inizialmente nello stato di "runnable", in attesa che lo scheduler lo faccia passare allo stato di "running".

    Originariamente inviato da matthew80
    ma sti thread non si sembrano proprio semplicissimi.
    Mah, guarda, la parte "base" sui thread cioè definizione, istanziazione, avvio di un Thread e transizione da uno stato all'altro, di per sé non sono difficili.
    La parte decisamente più tosta e complessa è tutta quella riguardante la "concorrenza": interazione tra thread, sincronizzazione, thread safety, accesso ad oggetti condivisi, collezioni synchronized, ecc....

    Originariamente inviato da matthew80
    Cmq vedo che sei certificato Sun, complimenti!
    Da che libro hai studiato?
    Grazie, ho fatto l'esame solo pochi giorni fa e sono molto soddisfatto del risultato.
    Di libri su Java ne ho diversi, tra cui "Java Programming Language, The, 4th Edition" di Arnold/Gosling/Holmes e "SCJP Sun Certified Programmer for Java 5 Study Guide" di Sierra/Bates.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.