Java thread

di il
11 risposte

Java thread

Salve a tutti, volevo chiedervi se è possibile in base ad un controllo di flusso poter mettere in coda un thread.
Ho più thread che accedono con dovuta sincronizzazione al metodo della classe, ora prima di finire io voglio che questo thread riesegua le istruzioni mettendosi in coda agli altri..come faccio?

11 Risposte

  • Re: Java thread

    pc00 ha scritto:


    Salve a tutti, volevo chiedervi se è possibile in base ad un controllo di flusso poter mettere in coda un thread.
    Ho più thread che accedono con dovuta sincronizzazione al metodo della classe, ora prima di finire io voglio che questo thread riesegua le istruzioni mettendosi in coda agli altri..come faccio?
    Purtroppo la tua domanda è un po' vaga e non chiarissima (io perlomeno non ho capito il problema). Prova a rispiegare la questione, magari descrivendo meglio il contesto e gli obiettivi.
  • Re: Java thread

    Grazie per la risposta,
    In pratica lancio 8 thread su uno stesso oggetto e tramite sincronizzazione questi thread eseguono le stesse cose uno ad uno.
    Ora se io al posto di farlo terminare alla fine del run volessi che questo thread si mettesse in coda a quelli che ancora devono eseguire le istruzioni come posso fare? Tipo lancio 8 thread ,4 eseguono le istruzioni ma devono rimettersi in coda a quelli che ancora devono eseguirle per rieseguirle di nuovo.
    Scusa il gioco di parole
  • Re: Java thread

    pc00 ha scritto:


    Ora se io al posto di farlo terminare alla fine del run volessi che questo thread si mettesse in coda a quelli che ancora devono eseguire le istruzioni come posso fare? Tipo lancio 8 thread ,4 eseguono le istruzioni ma devono rimettersi in coda a quelli che ancora devono eseguirle per rieseguirle di nuovo.
    Scusa il gioco di parole
    Uhm .. credo ora di aver capito. Mettiamola così: se vuoi rieseguire qualcosa chiaramente di per sé basterebbe un banale "loop" ma non sarebbe sufficiente per quello che chiedi e credo di aver capito.

    Se hai 4 thread A B C e D, tu vuoi che un certo codice x venga eseguito da B solo dopo che il codice x è stato eseguito da A. E che C lo esegua solo dopo che l'ha eseguito B ecc...
    Corretto?

    Per questo non basta un semplice synchronized. Serve un coordinamento tra i thread in modo che ciascuno stia in wait (attesa) finché non è il suo turno. In altre parole serve una sorta di "semaforo".

    Di recente (circa 2 mesi fa) c'è stata una discussione qui relativa ai thread e alla coordinazione tra thread:


    La discussione è un po' lunga, prova a leggerla sperando che non ti annoi.
    In particolare cerca di arrivare al mio post del 31 agosto 2015, 21:57 dove ho fatto l'esempio con wait/notify.

    Se hai altri dubbi, prosegui pure in questa discussione (non quella linkata, perché già un po' lunghetta ...).
  • Re: Java thread

    Vedrò subito la discussione, volevo dirti che ho provato a mettere tutto in un loop e poi alla fine mettendo un wait ma nulla da fare,diciamo che me ne esegue sempre un tot alla volta e mai tutto
    Ho provato cosi:
    while(condizione){





    //codice

    //e alla fine ho messo
    synchronized(this){
    if(condizione)
    while(condizione){
    wait();
    }





    }
    ma nulla da fare provo a vedere il post grazie
    Comunque io voglio che un thread A esegua lo stesso codice solo se le azioni degli altri thread lo permettono
  • Re: Java thread

    Ho visto che parlano molto di wait e notify ma proprio sul semaforo non ho visto nessun continuo della discussione ,come posso fare ? Proverei a metterli in wait ,tanto prima o poi la notify li "pescherà",non so..
  • Re: Java thread

    pc00 ha scritto:


    Ho visto che parlano molto di wait e notify ma proprio sul semaforo non ho visto nessun continuo della discussione ,come posso fare ? Proverei a metterli in wait ,tanto prima o poi la notify li "pescherà",non so..
    Mio post del 31 agosto 2015, 21:57 in quella discussione.

    EDIT: qui
  • Re: Java thread

    Grazie per la risposta , diciamo che ho risolto , però ora ho un altro dubbio
    ho (x esempio) 5 thread su 5 oggetti diversi di una stessa classe che devono rimanere in attesa o meno in base ad una variabile globale.
    Uso il wait dentro un while , ma poi anche se c'è il cambio di questa variabile e io faccia il notifyAll() i thread in attesa rimangono li in eterno, questo perchè appartengono ad oggetti diversi? Se si come posso risolvere?
  • Re: Java thread

    pc00 ha scritto:


    ho (x esempio) 5 thread su 5 oggetti diversi di una stessa classe che devono rimanere in attesa o meno in base ad una variabile globale.
    Uso il wait dentro un while , ma poi anche se c'è il cambio di questa variabile e io faccia il notifyAll() i thread in attesa rimangono li in eterno, questo perchè appartengono ad oggetti diversi? Se si come posso risolvere?
    Affinché il principio di attesa-notifica funzioni, wait e notify/notifyAll devono operare (essere invocati) sullo stesso oggetto di cui è stato acquisito il lock. La condition-queue deve essere la stessa.
  • Re: Java thread

    Quindi se non sono dello stesso oggetto non posso usare la notify giusto?
    Grazie mille comunque per la chiarezza
  • Re: Java thread

    pc00 ha scritto:


    Quindi se non sono dello stesso oggetto non posso usare la notify giusto?
    Ogni oggetto possiede un lock (detto "monitor" nel senso tecnico/teorico più preciso) a cui è associata una condition-queue che è sostanzialmente un "wait set", un insieme di thread in attesa.
    Se fai a.wait() avendo il lock di a, il thread corrente va in sospensione e viene messo nel wait set di a. Se poi da un'altra parte fai b.notify() (b oggetto differente), esso risveglia i thread nel suo wait set, di b. E siccome il thread in attesa è nel wait set di a e NON di b ... non si risveglia certo!
  • Re: Java thread

    Ottimo grazie mille per la spiegazione!
    Un ultima cosa , volevo sapere qual'è l'utilità di creare gruppi di thread se possibile(thread appartenenti ad un group)
Devi accedere o registrarti per scrivere nel forum
11 risposte