Java, Future és a többszálúság esete

Fórumok

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.

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.

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

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

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

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.