Thread

di il
39 risposte

39 Risposte - Pagina 3

  • Re: Thread

    Con notifyall tutti i thread avendo priorità di default 5 hanno la stessa probabilità di essere eseguiti una volta che il lock è stato rilasciato.
    Con notify solo una avrà la possibilità di partire, che nel caso dello scheduler è quella scritta successivamente quindi è dipendente dal s.o.
    Ho detto bene?
  • Re: Thread

    Allora del codice scritto perchè non capita mai l'eccezione qui:
    
    try {
                while (currentIndex != index) {
                    wait();
                }
            } catch (InterruptedException e) { // 
                System.err.println(e);
                return;
            }
    

    e poi il comando return l'ho usato solo nel caso di un metodo che ritorna un valore...
    Qui che fa?
  • Re: Thread

    Michele Genchi ha scritto:


    Con notifyall tutti i thread avendo priorità di default 5 hanno la stessa probabilità di essere eseguiti una volta che il lock è stato rilasciato.
    Con notify solo una avrà la possibilità di partire, che nel caso dello scheduler è quella scritta successivamente quindi è dipendente dal s.o.
    Ho detto bene?
    Qui non c'entra la priorità dei thread impostabile sul java.lang.Thread. La questione è più fine e probabilmente non ci sei ancora arrivato.

    Ecco uno scenario di esempio (grazie anche allo sleep con tempo casuale che rende più arbitrarie le tempistiche).

    Mettiamo che arriva per primo ad acquisire il lock ed eseguire il call il Caller <1>. Siccome 0 != 1 è true, entra nel while e va in sospensione perché giustamente non è il suo turno.
    Poi mettiamo che arriva per secondo il Caller <2>, idem siccome 0 != 2 è true entra nel while e va in sospensione non essendo nemmeno il suo turno.
    Poi arriva il Caller <0> e siccome 0 != 0 è false salta proprio il while (non ci entra nemmeno), quindi stampa le scritte e incrementa il currentIndex e poi "notifica".

    Ora ecco la differenza tra notify e notifyAll.

    Con notify() viene svegliato un solo thread e attenzione uno a caso tra quelli nel "wait set" di quel lock. La documentazione ufficiale di notify() è molto chiara su questo: "The choice is arbitrary and occurs at the discretion of the implementation."

    Se è "a caso", allora potrebbe svegliare il thread sbagliato, ad esempio quello del Caller <2>. Se non ci fosse il ciclo sul wait, il Caller <2> proseguirebbe nella stampa ma non sarebbe concettualmente corretto, visto l'obiettivo.
    Grazie al ciclo invece verrebbe ritestata la condizione che ora è 1 != 2 ed essendo true si rimetterebbe in attesa. Il risultato è che la sequenza si pianterebbe lì, il <1> è ancora in attesa e non può continuare e il <2> si è rimesso anch'esso in attesa.
    La tua applicazione è completamente bloccata e non può proseguire nella sequenza!

    Con notifyAll() invece tutti i thread in attesa nel wait set di quel lock vengono risvegliati. Qui a maggior ragione serve il ciclo con il test.
    Se anche il Caller <2> riesce a riacquisire il lock prima del <1>, ritesta la condizione e si rimette in attesa perché giustamente non è ancora il suo turno. Ma ora anche il <1> ha la possibilità di riacquisire il lock e ritestare la condizione e adesso è proprio il suo turno. Quindi poi tutto procede correttamente.

    Questo è appunto uno dei motivi per cui il wait() dovrebbe sempre essere fatto dentro un ciclo che testa una condizione che deve "reggere" affinché il thread stia in attesa.

    Michele Genchi ha scritto:


    Allora del codice scritto perchè non capita mai l'eccezione qui:
    Un altro thread dovrebbe fare un interrupt su uno dei tre thread. Ma non c'è una cosa del genere nel codice. Quindi perlomeno volutamente non c'è questo interesse/obiettivo.

    Michele Genchi ha scritto:


    e poi il comando return l'ho usato solo nel caso di un metodo che ritorna un valore...
    Qui che fa?
    Semplicemente fa ritornare il metodo, senza alcun valore (il metodo è void).
  • Re: Thread

    Cmq i programmi del libro non mi convincono tanto... mah
    ora sto facendo il classico esempio produttore/consumatore
    a parte l'inutilità di utilizzare una variabile booleana, almeno credo
    sembra che non funzioni proprio...
  • Re: Thread

    Il libro proponeva un programma come esempio del metodo wait() e notify();
    che prevedeva un produttore ed un consumatore di prodotti e un magazzino ideale che :
    poteva inserire prodotti finchè il magazzino non era pieno
    poteva consumare prodotti se c'erano in magazzino

    funziona anche questo

    quindi ora sono passato alla libreria collection. mi chiedevo come si fanno a ricordare tutte queste cose o come fa una persona a capire dove vanno applicate...
    Esempio il programmino che ho fatto che capiva se un numero era binario, decimale ecc poteva essere fatto in tanti modi.... usando librerie pronte o altro...
    Cosa devo esattamente sapere per candidarmi ad un lavoro? Se sperano che senza esperienza sia già bravo quanto te, stiamo freschi:-)
  • Re: Thread

    Michele Genchi ha scritto:


    mi chiedevo come si fanno a ricordare tutte queste cose o come fa una persona a capire dove vanno applicate...
    Guarda, te lo dico sinceramente e anche per tranquillizzarti: ci vuole tempo per acquisire queste e tante altre cose su Java. Già solo nel linguaggio Java in sé ci sono davver una marea di cose da sapere, se mettiamo pure in ballo tutte le ultimissime novità di Java 7/8. Non si può pensare di impararle tutte in poche settimane e credo nemmeno in pochi mesi!

    L'importante è aver voglia di proseguire nello studio, in modo continuativo e soprattutto in modo "progressivo", cioè partendo da cose più semplici e andando verso argomenti sempre più complessi. E poi chiaramente serve anche "applicarsi" un po', provando a scrivere codice anche solo come "esercitazione". Solo a leggere libri/siti/tutorial credo serva a ben poco se poi non si fa un po' di pratica.

    Michele Genchi ha scritto:


    Cosa devo esattamente sapere per candidarmi ad un lavoro?
    A livello proprio base (da Java "junior") sicuramente bisogna dimostrare di avere una buona e valida conoscenza del linguaggio Java (comprese almeno tutte le feature di Java 5) e delle parti più importanti del framework standard. Poi anche la conoscenza di almeno 1 IDE e di qualche altro strumento di sviluppo (es. Ant/Maven) può essere utile.
    Inoltre anche il conseguimento di una delle certificazioni Oracle su Java è sicuramente un punto a favore nel mondo del lavoro. Possono sicuramente aiutare e te lo posso dire per esperienza personale.
    Di più non saprei dirti ... non sono certo un "recruiter", e non so nemmeno bene cosa al giorno d'oggi viene richiesto ai candidati Java "junior".
  • Re: Thread

    Non pretendo tutta la tua pazienza, ma finché ne avrai io ci sto, studio duramente ed incrocio le dita...
    Il programmino tuo l'avevo capito e l'ho applicato al programma magazzino... Forse prima di passare alle collection dovrei inventari un programmino dove applicare i thread, tipo il simulatore di un semaforo... Anche perché le collection è un argomento tosto
  • Re: Thread

    Allora amico caro, proviamo da un esercizio semplice.. . simulo un solo semaforo che venga acceso alle 6 di mattina e spento a mezzanotte... E poi se mi riesce questo, provo a simulare un incrocio... Te gusta l'idea:-) ??? Una volta fatto anche questi ed il thread sarà nel mio DNA passò alle collection
  • Re: Thread

    Obiettivo alle 6 passa dal giallo lampeggiante al rosso, poi dal rosso al verde, e poi dal verde al giallo, per ritornare poi nuovamente rosso...alle 23,59 si spegne e ritorna giallo lampeggiante...
    Ad ogni colori stampa un conto alla rovescia che mostra i secondi effettivi x ogni colore...
    Divertente... Solo che devo riprovarci nel pom.
  • Re: Thread

    Mmmh un pò di difficoltà
    date due stringhe
    ora di accensione semaforo
    ora di spegnimento semaforo
    bisogna verificare se l'ora corrente é compresa
    se si ritorna vero
    altrimenti falso
Devi accedere o registrarti per scrivere nel forum
39 risposte