Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Thread in JAVA

  1. #1

    Thread in JAVA

    Salve a tutti, ho iniziato ora a studiare un esame che prevede l'utilizzo di thread e mi è capitato un esercizio dove c'è un programma da dover completare. Il programma deve stampare soltanto una volta ":-)". Potete aiutarmi? Grazie a tutti per l'aiuto.
    codice:
    public class Smiley extends Thread {    
        public void run() {
            while(true) {
                try {
                    //IL TUO CODICE VA QUI
                } catch (InterruptedException e) {
                    e.printStackTrace(); 
                }
            }
        }
        
        private void printParentesiChiusa() throws InterruptedException {
            System.out.println(")"); Thread.sleep(100);
        }
        
        private void printTrattino() throws InterruptedException {
            System.out.print("-"); Thread.sleep(100);
        }
        
        private void printDuePunti() throws InterruptedException {
            System.out.print(":"); Thread.sleep(100);
        }
        
        public static void main(String[] args) {
            new Smiley().start();
            new Smiley().start();
        }
        
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Aleandro23 Visualizza il messaggio
    Il programma deve stampare soltanto una volta ":-)". Potete aiutarmi?
    La richiesta non è molto chiara .... anche se nel punto "IL TUO CODICE VA QUI" ci metti le invocazioni ai 3 metodi printXXXX, siccome il Thread Smiley viene istanziato e avviato 2 volte, la stampa è comunque come minimo "duplicata" (senza contare che c'è un while(true) !).
    E poi siccome non c'è alcuna sincronizzazione tra i due thread, la stampa delle 3 singole parti può benissimo essere "mescolata" tra i thread.

    Quindi precisa bene COSA si vuole ottenere e cosa ti è lecito cambiare/togliere/aggiungere.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    La richiesta non è molto chiara .... anche se nel punto "IL TUO CODICE VA QUI" ci metti le invocazioni ai 3 metodi printXXXX, siccome il Thread Smiley viene istanziato e avviato 2 volte, la stampa è comunque come minimo "duplicata" (senza contare che c'è un while(true) !).
    E poi siccome non c'è alcuna sincronizzazione tra i due thread, la stampa delle 3 singole parti può benissimo essere "mescolata" tra i thread.

    Quindi precisa bene COSA si vuole ottenere e cosa ti è lecito cambiare/togliere/aggiungere.
    Mi scuso, non avevo capito perfettamente. Il professore vuole che le funzioni siano evocate nel giusto ordine, ed è possibile inserire codice solo nel try.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Aleandro23 Visualizza il messaggio
    Il professore vuole che le funzioni siano evocate nel giusto ordine, ed è possibile inserire codice solo nel try.
    Chiarissimo ora. La questione da comprendere è questa. Se nel try invochi banalmente i 3 metodi in sequenza e basta, all'interno di un singolo thread la sequenza è ovviamente garantita. Ma siccome ci sono 2 thread, la esecuzione dei metodi può essere intercalata tra i due thread in qualunque dei modi possibili per la sequenza.
    Vuol dire che NON è affatto detto che ottieni :-):-) ma potresti anche ottenere ::--)) o ::-)-) o qualunque altra sequenza lecita. (chiaramente dopo ) c'è il newline, gli esempi li ho scritti di fila per semplicità)

    Quello che serve è fare in modo che l'insieme delle 3 operazioni sia "atomico" e questo lo si fa acquisendo il "lock" (sarebbe più corretto dire il monitor ma tendo generalmente a dire lock) su un oggetto in modo che solo un thread per volta possa eseguire il pezzo di codice che esegue i 3 print.

    Visto che puoi solo cambiare nel try, dovrai per forza usare un blocco synchronized, ovvero un blocco { } che usa la parola chiave synchronized per acquisire il lock su un oggetto specifico.

    Ed ecco il punto: quale oggetto? Presta attenzione, deve essere un oggetto che sia condiviso tra i due thread, altrimenti se fossero due distinti non avresti più la mutua-esclusione.
    Quindi prova a pensare: puoi usare come oggetto di lock il this? Pensaci bene.
    Se non potessi usare il this, allora cosa potresti usare?
    Ultima modifica di andbin; 13-10-2017 a 21:00
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Chiarissimo ora. La questione da comprendere è questa. Se nel try invochi banalmente i 3 metodi in sequenza e basta, all'interno di un singolo thread la sequenza è ovviamente garantita. Ma siccome ci sono 2 thread, la esecuzione dei metodi può essere intercalata tra i due thread in qualunque dei modi possibili per la sequenza.
    Vuol dire che NON è affatto detto che ottieni :-):-) ma potresti anche ottenere ::--)) o ::-)-) o qualunque altra sequenza lecita. (chiaramente dopo ) c'è il newline, gli esempi li ho scritti di fila per semplicità)

    Quello che serve è fare in modo che l'insieme delle 3 operazioni sia "atomico" e questo lo si fa acquisendo il "lock" (sarebbe più corretto dire il monitor ma tendo generalmente a dire lock) su un oggetto in modo che solo un thread per volta possa eseguire il pezzo di codice che esegue i 3 print.

    Visto che puoi solo cambiare nel try, dovrai per forza usare un blocco synchronized, ovvero un blocco { } che usa la parola chiave synchronized per acquisire il lock su un oggetto specifico.

    Ed ecco il punto: quale oggetto? Presta attenzione, deve essere un oggetto che sia condiviso tra i due thread, altrimenti se fossero due distinti non avresti più la mutua-esclusione.
    Quindi prova a pensare: puoi usare come oggetto di lock il this? Pensaci bene.
    Se non potessi usare il this, allora cosa potresti usare?
    Scusa perchè this non va bene? Non è un oggetto in comune? Mi dispiace, non riesco a capire cosa potrei mettere se non this . PS: ho provato con this per curiosità e non va come mi avevi fatto capire.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Aleandro23 Visualizza il messaggio
    Scusa perchè this non va bene? Non è un oggetto in comune?
    Il this è il riferimento all'oggetto su cui è stato invocato un metodo. In quel caso l'oggetto di tipo Smiley su cui "qualcuno" (il framework, non tu direttamente) ha invocato il run().
    Già ... ma quanti oggetti Smiley hai?? E quindi secondo te sono in comune?

    Cosa hanno in comune tutti gli oggetti Smiley? .... la classe Smiley! E puoi ottenere la classe (il java.lang.Class) di un oggetto?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Adesso funziona! Ho usato come parametro di synchronized Smiley.class e adesso stampa solo :-) . Ti ringrazio, non ti sei limitato a dirmi la soluzione ma mi hai anche fatto capire bene il concetto .

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Aleandro23 Visualizza il messaggio
    Ho usato come parametro di synchronized Smiley.class
    Sì, puoi usare un class "literal" Smiley.class oppure puoi prendere il Class dall'oggetto con this.getClass() (o più abbreviato solo getClass() siccome this è implicito).
    Il Class ottenuto è lo stesso, il risultato non cambierebbe.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java 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 © 2024 vBulletin Solutions, Inc. All rights reserved.