Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: sui thread!

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93

    sui thread!

    ciao ragazzi ancora un aiutino perfavore,stavolta sui thread

    premesso che ho creato un thread perfettamente funzionante,se ne istanzion una decina come faccio a far operare ognuno ogni tot secondi?(ad esempio ogni 3 secondi)

    mi spiego:diciamo che ogni thread dice il suo nome,se ne istanzio 10 vorrei che il risultato fosse questo:

    mi chiamo 1
    3 secondi
    mi chimao 2
    3 secondi
    mi chiamo 3
    3 secondi

    ecc....

    mettendo uno sleep alla fine del thread creato mi fa una cosa del genere,ovviamente scontata perchè partono tutti insieme a pochi millesimi l'uno dall'altro...

    mi chiamo1
    mi chiamo2
    mi chiamo3
    ...
    mi chiamo10
    3 secondi
    mi chiamo1
    mi chiamo2
    mi chiamo3
    ....


    grazie mille

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

    Re: sui thread!

    Originariamente inviato da ratal
    mi spiego:diciamo che ogni thread dice il suo nome,se ne istanzio 10 vorrei che il risultato fosse questo:

    mi chiamo 1
    3 secondi
    mi chimao 2
    3 secondi
    mi chiamo 3
    3 secondi
    Beh, ma allora non ci sarebbe nulla di "concorrente" .... è "sequenziale"!

    Comunque quando si ha a che fare con i thread non ci sono molte garanzie. Non c'è alcuna garanzia sul fatto che l'ordine di partenza dei thread sia uguale all'ordine con cui hai fatto le start().

    Es.:
    thread1.start ();
    thread2.start ();

    Il thread2 potrebbe anche partire prima di thread1!

    E non c'è alcuna garanzia su come, con quali tempistiche, i thread progrediranno nella loro esecuzione.
    La principale garanzia è che una volta che un thread è partito, eseguirà le sue operazioni in modo sequenziale e ad un certo punto terminerà.
    All'interno di un thread la sequenza delle operazioni è ovviamente chiara e prevedibile. Mentre le operazioni tra thread diversi possono "intercalarsi" in modo assolutamente imprevedibile.

    E ripeto che, ritornano al tuo esempio, quello è sequenziale, non ci sarebbe alcun bisogno della "concorrenza".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    allora mettiamola cosi'...fai conto che il thread abbia un ciclo while infinito che dice come si chiama.se ne istanzio 10 come faccio a far si che ognuno dica una volta ogni 3 secondi come si chiama?qui la concorrenza c'è eccome

    p.s. ovviamente ogni 3 secondi COMPLESSIVI come detto all'inizio

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ratal
    allora mettiamola cosi'...fai conto che il thread abbia un ciclo while infinito che dice come si chiama.se ne istanzio 10 come faccio a far si che ognuno dica una volta ogni 3 secondi come si chiama?
    Come sicuramente hai già fatto ... mettendo nel run() il print del nome e lo sleep di 3 secondi, tutto ripetuto all'infinito. Ma gli sleep essendo su thread diversi si parallelizzano, quindi è praticamente sicuro che i thread stamperanno velocemente tutti insieme il loro nome, poi tutti attenderanno 3 secondi e via di seguito. Ma è anche molto probabile che la sequenza dei print non sia più in ordine, già da subito o dopo poco tempo ... è sufficiente che lo scheduler faccia attendere un pochino di più un thread e la sequenza si sfalsa.

    Originariamente inviato da ratal
    qui la concorrenza c'è eccome
    Ma prima chiedevi una cosa diversa: print/sleep del thread 1 poi print/sleep del thread 2 poi ecc. Questo è sequenziale ... non concorrente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    ma scusa come ho già fatto nn ottengo quello che voglio...nei 10 thread con cilco while voglio che venga stampata la loro operazione interna ogni 3 secondi,secondo la prima logica scritta nel primo post.se li faccio come hai detto il risultato è la seconda serie...

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    ho trovato una "mezza" soluzione ma nn credo ci siano alternative...oltre a mettere uno sleep all'interno di ogni thread ne metto anche uno nel main fra il lancio dell'uno e dell'altro in modo che si alternino regolarmente...

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ratal
    ma scusa come ho già fatto nn ottengo quello che voglio...nei 10 thread con cilco while voglio che venga stampata la loro operazione interna ogni 3 secondi,secondo la prima logica scritta nel primo post.se li faccio come hai detto il risultato è la seconda serie...
    Ok, rispiego che è meglio:

    Se le operazioni nel singolo thread sono:
    1) print del nome
    2) sleep di 3 secondi
    (anche ripetute in un ciclo infinito)

    e tu vuoi avere una esecuzione del tipo:

    print thread 1
    sleep thread 1
    print thread 2
    sleep thread 2
    print thread 3
    sleep thread 3
    ....

    Questo presuppone una certa sequenzialità, una "serializzazione" delle operazioni tra i diversi thread. E la cosa va valutata e gestita con opportune sincronizzazioni.

    Se ti basta che print+sleep di un thread sia fatto in modo "atomico", cioè mentre lo fai nessun altro thread possa farlo, allora è sufficiente che il print+sleep lo fai in un metodo synchronized e ovviamente il lock deve essere uguale per tutti i thread, quindi un metodo di istanza su un oggetto condiviso o un metodo di classe.

    Questo però renderebbe atomico solo il print+sleep, non impedirebbe che es. il thread 5 possa eseguire la sequenza print+sleep prima del thread 2.

    Se invece vuoi proprio che print+sleep del thread X venga sempre prima del print+sleep del thread X+1, allora c'è bisogno di una sincronizzazione ancora più complessa.

    Purtroppo sono questioni molto delicate e fini, spero ti sia un po' più chiaro ora.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    grazie andbin si ho capito adesso,comunque col mio metodo,anche se brutale e poco sicuro,funziona tutto bene...

    posso chiederti un altra cosa?cioè che ho ottenuto è tutto a console,ma devo inserirlo in un interfaccia grafica.come faccio a vedere quello che appare ora sulla console ad esempio in una jtextarea?c'è un modo?grazie

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ratal
    devo inserirlo in un interfaccia grafica.come faccio a vedere quello che appare ora sulla console ad esempio in una jtextarea?c'è un modo?grazie
    JTextArea ha il metodo append(String str). E nota che è chiaramente documentato come thread-safe, quindi puoi invocarlo da qualunque thread.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    scusa se ti rompo ma sono ancora piuttosto neofita riguardo la grafica...
    mettiamo che mi costruisca un jpanel con un tasto "simula" e una jtextarea.metto un ascoltatore che mi fa partire una 20ina di tread in caso di pressione del tasto.considerando l'esempio precedente,dato che le system.out.println sono dentro al run(),come posso fare per "acchiapparle" una per una nella jtextarea?
    grazie mille!!

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.