Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Palacka 06. 03. 2011, 18:42:08

Název: Java a medzi-threadova komunikácia
Přispěvatel: 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 ...

Název: Re: JAVA: otazka - medzi-threadova komunikacia
Přispěvatel: Palacka 06. 03. 2011, 18:52:11
Ok dal som si kafe ... presiel sa po miestnosti ... a mam to ... globalData ... nwm
Název: Re: Java a medzi-threadova komunikácia
Přispěvatel: alefo 07. 03. 2011, 00:19:51
Jedno z rieseni: obe vlakna zdielaju rovnaky CopyOnWriteArrayList<String>. Ten je thread-safe a vo vasom pripade bude mat dlzku jedna.
Název: Re: Java a medzi-threadova komunikácia
Přispěvatel: pssp 07. 03. 2011, 15:00:24
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)
Název: Re: Java a medzi-threadova komunikácia
Přispěvatel: podlesh 07. 03. 2011, 17:01:49
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.
Název: Re: Java a medzi-threadova komunikácia
Přispěvatel: Palacka 07. 03. 2011, 23:35:17
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 :)
Název: Re: Java a medzi-threadova komunikácia
Přispěvatel: podlesh 07. 03. 2011, 23:42:22
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).
Název: Re: Java a medzi-threadova komunikácia
Přispěvatel: alefo 08. 03. 2011, 01:02:19
Keby bola ta premenna volatile, treba synchronized? Ved String je immutable a priradenie je v Jave vzdy atomicke, alebo nie?
Název: Re: Java a medzi-threadova komunikácia
Přispěvatel: pssp 08. 03. 2011, 08:10:11
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.