Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Palacka 06. 03. 2011, 18:42:08
-
Zdravim,
robim na jendom projekte, a strasne sa mi pari z hlavy lebo mam taky blackout ze si neviem spomenut na nijake mozne riesenie...
CO POTREBUJEM:
Potrebujem nejaky sposob ako si thready v jave medzi sebou mozu posielat String
BACKGROUND:
Kazdy Thread ma vlastnu STRING variablu ktora je prazna, pokial sa nestane nieco zle. Ta variabla sa vola errorsReported
(public String errorsReported = "";)
PROBLEM:
Mam 2 thready ktore vytvaram aby komunikovali nezavysle od seba s tretimi stranamy. Ako preboha mozem z jedneho threadu poslat nieco do druheho?
PRIKLAD:
Thread 1 ma napriklad String "ERROR 21" - ako tuto spravu poslem druhemu Threadu? nic ma nenapada ...
Dakujem ! :(
P.S.: Pripustam aj najjednoduchsie a najprimitivnejsie moznosti proste mi to uz nemysli ...
-
Ok dal som si kafe ... presiel sa po miestnosti ... a mam to ... globalData ... nwm
-
Jedno z rieseni: obe vlakna zdielaju rovnaky CopyOnWriteArrayList<String>. Ten je thread-safe a vo vasom pripade bude mat dlzku jedna.
-
Este jednoduchsie nez CopyOnWriteArrayList je pouzit zdielanu instanciu AtomicReference (riesi rovnaky problem ako volatile field, ale instancie AtomicReference sa daju krajsie zdielat bez toho aby museli vsetky objekty pristupovat k rovnakemu fieldu)
-
Bacha na to, komunikace mezi vlákny (nejenom v Javě) rozhodně není triviální věc a je velmi velmi snadné udělat zásadní chybu. Nejlepší je něco o tom nastudovat, ale pozor: bude toho hodně. Pokud toho bude na nastudování málo, pak je to špatný studijní materiál :-\
Výše uvedená AtomicReference je v podstatě správná odpověď, ale s nejvyšší pravděpodobností hned v dalším kroku bude zapotřebí složitější komunikace.
-
No kedze slo iba o jednoduchy string na nie narocnej aplikacii tak som jednoducho v Klasse o jedno vyssej vytvoril private String a k nemu get a set public metody a funguje ako po masle :)
-
No kedze slo iba o jednoduchy string na nie narocnej aplikacii tak som jednoducho v Klasse o jedno vyssej vytvoril private String a k nemu get a set public metody a funguje ako po masle :)
Ty metody jsou doufám synchronized... jinak je to samozřejmě špatně.
A to že to třeba zrovna funguje nic neznamená (navíc zkoušeno jen na x86, předpokládám).
-
Keby bola ta premenna volatile, treba synchronized? Ved String je immutable a priradenie je v Jave vzdy atomicke, alebo nie?
-
Keby bola ta premenna volatile, treba synchronized? Ved String je immutable a priradenie je v Jave vzdy atomicke, alebo nie?
Pokial si to spravne nezosynchronizujete (volatile alebo synchronized, alebo final AtomicReference), riskujete, ze priradenie noveho stringu nebude v ostatnych threadoch vidiet. Detaily vid Java Memory Model.