Ce face SwingUtilities.invokeLater? [duplicat] (Programare, Java, Multithreading, Leagăn, Awt, Fir De Expediere A Evenimentelor)

user633784 a intrebat.

Ce face SwingUtilities.invokeLater face? Este doar întârzierea executării unui bloc de coduri în interiorul lui run metoda? Care este diferența dintre apelarea unei acțiuni în cadrul metodei invokeLater funcție sau pur și simplu apelarea acesteia la sfârșitul firului pe care dorim să fie executată? Mă poate ajuta cineva să înțeleg ce face cu adevărat invokeLater face funcția?

Comentarii

  • Vedeți și stackoverflow.com/questions/5780936/… pentru informații de fond (informații de fond legate, dar nu duplicat). –  > Por Donal Fellows.
5 răspunsuri
Maurice Naftalin

Așa cum au spus și alte răspunsuri, execută dvs. Runnable pe firul de distribuire a evenimentelor AWT. Dar de ce ai vrea să faci asta? Pentru că structurile de date Swing nu sunt thread-safe, așa că, pentru a oferi programatorilor o modalitate ușor de realizat de a preveni accesul concurent la ele, proiectanții Swing au stabilit regula că tot codul care le accesează trebuie să ruleze pe același fir. Acest lucru se întâmplă în mod automat în cazul codului de gestionare a evenimentelor și de întreținere a afișajului, dar dacă ați inițiat o acțiune de lungă durată – pe un nou fir, desigur – cum puteți semnala progresul sau finalizarea acesteia? Trebuie să modificați un control Swing și trebuie să faceți acest lucru din firul de distribuire a evenimentelor. De aceea, invokeLater.

Comentarii

  • OOH! deci așa se poate face asincronizarea asincronă cu un singur fir în java! Totuși, este ciudat că trebuie să fie inclusă într-un set de instrumente „Windowing”, pare puțin deplasată. –  > Por Dmitry.
  • @Dmitry Acesta este un mod amuzant de a privi lucrurile. Java nu oferă suport la nivel de limbaj pentru single-threading (există vreun limbaj?). Deci, un cadru care necesită acest lucru trebuie să ofere caracteristici pentru a-l susține și să stabilească reguli pentru ca programatorul client să îl folosească corect. Aceasta nu este „modul Java de a face acest lucru”, ci mai degrabă un mod de a face acest lucru în Java. –  > Por Maurice Naftalin.
MByD

Acesta va rula fragmentul de cod pe firul AWT. Ceea ce vă permite să modificați interfața grafică din alte fire de execuție.

De la Docs:

Determină ca doRun.run() să fie executat în mod asincron pe firul de distribuire a evenimentelor AWT. Acest lucru se va întâmpla după ce toate evenimentele AWT în așteptare au fost procesate. Această metodă ar trebui utilizată atunci când un fir al aplicației trebuie să actualizeze interfața grafică.

RalphChapin

După cum s-a menționat deja, InvokeLater vă permite să apelați în siguranță metodele din clasele swing atunci când nu se execută de la început pe EventQueue. Cu toate acestea, vă puteți simplifica codul și viața prin accesarea altor câmpuri și clase numai la din EventQueue. Acestea pot lucra cu swing și între ele fără toate problemele legate de multi-threading. Dacă ați pornit un alt fir de execuție, utilizați InvokeLater pentru a vă întoarce la EventQueue cât mai repede posibil și pentru a minimiza numărul de câmpuri care trebuie să fie sincronizate sau protejate în alt mod.

Dacă trebuie să profitați la maximum de mai multe nuclee, va trebui să reduceți utilizarea EventQueue și va trebui să plătiți un preț mare în ceea ce privește complexitatea.

mKorbel

asta ar fi un comentariu, dar pare la fel de lung ca…, doar chestii de bază.

1/ creați propriul EDT pentru actualizarea corectă a interfeței grafice, de exemplu, dacă executați un cod folosind simplele coduri de tip vanilie. Fire de legătură, java.util.Timer, Executoraici

2/ ajută cu setul Focus la JComponents în cazul în care există unele Listeners pentru că dacă există, de exemplu. DocumentListener atunci este greu să setați Focus la valoarea dorită JComponents

3/ întârzierea blocului de execuție a codului și mutarea acestuia la capetele EDT

gerardw

Rețineți că în cele din urmă veți obține un apel la metoda doRun.run( ) pentru fiecare fiecare dată când apelați invokeLater(doRun). Astfel, dacă o apelați de zece ori înainte ca firul de eveniment să aibă ocazia să își efectueze procesarea, este probabil să primiți zece apeluri succesive la doRun.run( ).