Visualizzazione dei risultati da 1 a 7 su 7

Discussione: invokeLater vs Thread

  1. #1

    invokeLater vs Thread

    Salve ha tutti c'è qualcuno che sa qual'è la differenza tra usare:

    SwingUtilities.invokeLater(new Runnable());

    oppure creare

    Thread t=new Thread(new Runnable());

    dove al posto di new Runnable() vi è il costruttore di una classe che implementa Runnable e in run() vi è definita la grafica del mio programma?

    Grazie mille Distinti Saluti.

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

    Re: invokeLater vs Thread

    Originariamente inviato da padrino9008
    Salve ha tutti c'è qualcuno che sa qual'è la differenza tra usare:

    SwingUtilities.invokeLater(new Runnable());
    invokeLater ha il solo scopo di far "passare" nel EDT (Event Dispatch Thread) e solo questo, la esecuzione del run() del Runnable.

    Originariamente inviato da padrino9008
    Thread t=new Thread(new Runnable());
    Con questo puoi creare un nuovo thread che è appunto un nuovo "flusso" di esecuzione nel tuo programma. invokeLater non crea un nuovo flusso, semplicemente "parcheggia" il Runnable in coda affinché venga poi eseguito solo ed esclusivamente nel contesto del EDT appena è possibile.

    Originariamente inviato da padrino9008
    dove al posto di new Runnable() vi è il costruttore di una classe che implementa Runnable e in run() vi è definita la grafica del mio programma?
    La creazione della interfaccia grafica ma sopratutto l'accesso a componenti, layout, model, ecc... va fatto solo nel contesto del EDT (salvo pochi casi particolari), non nel contesto di un tuo thread separato.
    Quindi se il tuo Runnable crea e/o opera con la interfaccia grafica, va usato invokeLater.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie mille :-) io fin ora avevo sempre fatto girare la grafica su un altro thread il tutto ha sempre funzionato.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da padrino9008
    Grazie mille :-) io fin ora avevo sempre fatto girare la grafica su un altro thread il tutto ha sempre funzionato.
    Non è che non funziona. Se crei o gestisci la interfaccia grafica da un thread che non è il EDT, può anche funzionare in molti casi (con tempistiche "fortunate") ma è inappropriato perché potrebbe anche non funzionare o dare effetti non previsti/voluti.
    Il multi-threading in generale pone questioni molto subdole e delicate, che se non le hai chiare non è facile nemmeno spiegarle in breve tempo. La gestione della interfaccia grafica nel framework è stata pensata per essere single-thread, c'è 1 solo thread chiamato convenzionalmente EDT che la gestisce. E questo va rispettato in linea di massima.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    mmm Grazie mille

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Aggiungo solo una cosa: è giusto creare thread aggiuntivi, per esempio dove un task scatenato da un evento su un elemento della GUI richieda molto tempo. Quello che invece non è giusto fare al di fuori dell'EDT è tutto quello di cui andbin t'ha già scritto.

    In altre parole, se la pressione su un tuo JButton genera una corposa query ad un database, il cui risultato va a popolare una JTable nella tua GUI stessa, è giusto creare un nuovo thread per l'esecuzione della query (onde evitare che la GUI resti "frizzata"), ma il successivo aggiornamento della GUI deve avvenire, per consistenza e coerenza (e quindi per evitare inaspettati comportamenti o eccezioni di sorta), nell'EDT con il "comodo" SwingUtilities.invokeLater
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Grazie di tutto giorno 20 Gennaio ho l' esame di linguaggi all'università è la prof ci ha solo detto che la grafica deve girare su un Thread diverso dal "Thread main", e che i Socket vanno gestiti allo stesso modo su altri thread, quindi io facevo tutto su un altri thread, invokeLater() lo scoperto per caso stamattina facendo qualche prova con netbeans che all'esame non possiamo usare perchè si fa tutto a mano con scite.

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.