Jo a také použitím vláken ztrácíš trochu kontrolu nad aplikací. V JEE si typicky nastavíš, že chces třeba max. 100 aktivních bean (100 vláken), ale jakmile si začneš tvořit vlákna sám, tak už žádný limit udělat nemůžeš. Také proto by se ty vlákna něměly dělat, ale čistě technicky to samozřejmě lze.
2012/4/13 Ondra Medek <[email protected]>: > No já myslím, že Petr bude ještě potřebovat nějakou synchronizaci až > se data načtou. > > V Tvém případě v JEE prostředí můžeš použít vlákna, protože tvoje > metoda je vlastně synchronní, jen jistá část kódu se kvůli výkonu volá > asynchronně. Akorát v těch vláknech nemůžeš používat JEE věci, jako je > např. přístup k DB. Ale i tak by bylo pravděpodobně lepší použít > některý z navrhovných způsobů. > > 2012/4/13 Jiří Chaloupka <[email protected]>: >> V J2EE se namísto toho využije aplikační server a pomocí message se pošle >> pokyn k vykonání nějaké asynchronní operace. >> Podívejte se třeba na >> http://www.java2s.com/Code/Java/EJB3/EJBTutorialfromJBossdemoformessagedrivenbean.htm >> Protože jste toto asi ještě nepoužil, ještě napovím, že zpráva může být >> různých typů včetně java.lang.Object >> >> Jirka Chaloupka >> >> Dne 13. dubna 2012 14:33 Petr Franta <[email protected]> napsal(a): >> >>> Chtěl jsem se zeptat na váš názor nebo zkušenost s prací ve vláknech J2EE >>> aplikací? >>> Četl jsem doporučení, že by se vlákna neměla v J2EE vytvářet resp., že >>> jsou doporučené metody jak to bezpečně dělat (pomocí různých implementací >>> timerů atd.). >>> >>> Řeším problém, kdy vlákno (request) potřebuje udělat tři dotazy do třech >>> různých databází a ty sloučit do jednoho výsledku. Je velmi pomalé čekat na >>> doběh jednotlivých dotazů, které jsou na sobě nezávislé. >>> Navrhl jsem pro začátek něco takového viz. níže, ale nejsem si jist jestli >>> tam není nějaká záludnost: >>> >>> /** definice pracovní třídy pro práci s DB (obsahuje vše potřebné k >>> načtení dat) */ >>> public class DbWorker implements Callable<Result> { >>> ... >>> } >>> >>> /** voláno z requestu */ >>> ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS); >>> List<Future<Result>> res = new ArrayList<Future<Integer>>(); >>> >>> for (DbTask task : tasks) { >>> // načtení dat >>> res.add(executor.submit(new DbWorker(task, ...))); >>> } >>> >>> // čekej na dokončení vláken >>> >>> // Zpracování načtených dat >>> for (Future<Integer> future : res) { >>> System.out.println(future.get()); >>> } >>> >>> Petr >> >> > > > > -- > Ondra Medek -- Ondra Medek
