Sziasztok!
Kezdő programozó vagyok a Javaban és kiváncsi lennék a következőre:
Van egy programom, ami SQL lekéréseket hajt végre egy szerveren. Szeretném, ha ezek a lekérések async módban történnének és nem függesztenék fel a main threadet, ezzel lefagyasztva a szálat. Mivel az SQL lekéréseknek vannak visszatérési értékük, ezért a Future - Callable kombót használnám, de nem tudom, hogy ez pontosan hogyan is működik. Hogyan oldjam meg, hogy amíg a main thread nem kapja meg a future.get()-et, addig ne álljon meg a szál?
Köszönöm a válaszaitokat.
- 4556 megtekintés
Hozzászólások
Future<MyClass> f;
MyClass res;
// ...
// Valamilyen loopban később
if (f.isDone()) {
res = f.get();
// ... res feldolgozása
}
Az isDone() nem blokkol. Ha kicsit megakaszthatod mégiscsak a szálat, akkor a get()-nek van olyan változata, aminek tudsz megadni timeoutot.
- A hozzászóláshoz be kell jelentkezni
hat valahol meg kell varni, kiveve, ha message queue-bol dolgozol, de akkor meg arra fog varni a szal, hogy uzenetet kapjon
mi az, amit nem akarsz megakasztani?
future f = sql(...)
.. megcsinalod, amit meg szeretnel ..
result r = f.get
render(r)
vagy valami ennel bonyolultabb?
--
NetBSD - Simplicity is prerequisite for reliability
- A hozzászóláshoz be kell jelentkezni
Illetve, ha kliens oldalon fejlesztesz, mondjuk java+swing-ben, akkor ez kell neked:
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
- A hozzászóláshoz be kell jelentkezni
Ha webes projekt, akkor async servlet, jetty continuation meg Play Framework 2-t nezd meg.
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám
- A hozzászóláshoz be kell jelentkezni
"Play Framework 2" ez most komoly, egy Javaval ismerkedőnek egy komplett keretrendszert ajánlasz, ami ráadásul a tök másik nyelvben van és teljesen más paradigmát képvisel??
-
Groovy funkcionális eszközök
- A hozzászóláshoz be kell jelentkezni
Komoly. Iranyt mutattam, majd o eldonti, hogy merre indul tovabb. Nem tudom, hogy mennyire kezdo, en szemely szerint szivesebben kezdek el egy keretrendszerrel epitgeni mukodo dolgokat egy uj platformmal valo ismerkedes soran, es utana leasni es ismerkedni az alatta levo API-kat, mint forditva...
"ami ráadásul a tök másik nyelvben van "
Lehet hasznalni Java-val is.
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám
- A hozzászóláshoz be kell jelentkezni
Tegyél rá egy listenert, vagy még elegánsabb a java.util.Observer/Observable használata. Amikor a futás befejeződik, akkor a listenert vagy az Observert értesítse a feldolgozószál. Ha így csinálod, akkor a Main thread futhat tovább, persze akkor ennek megfelelően kell felépítened a program logikáját is. Viszont mindezeket a j2se API-val meg lehet csinálni.
- A hozzászóláshoz be kell jelentkezni
Sajnos a beepitett Java Future implementacio nagyon gyenge. Javaslom hogy vess egy pillantas a Guava lib ListenableFuture
implementaciojara: https://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained Kicsit erosebb implementacio, tudsz listener-eket aggatni a Future-odre es nem kell blokkolnod a thread-edet.
- A hozzászóláshoz be kell jelentkezni
A java védelmében (igaz soha nem használtam a javas Future-t) pl. leszármazhatsz a FutureTaskból, aminek van egy protected done() metódusa amit overloadolhatsz saját kóddal. Innen már csak pár sor kód az observer design patternt megvalósítani.
- A hozzászóláshoz be kell jelentkezni