Java a medzi-threadova komunikácia

Palacka

Java a medzi-threadova komunikácia
« kdy: 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 ...

« Poslední změna: 06. 03. 2011, 21:38:43 od Petr Krčmář »


Palacka

Re: JAVA: otazka - medzi-threadova komunikacia
« Odpověď #1 kdy: 06. 03. 2011, 18:52:11 »
Ok dal som si kafe ... presiel sa po miestnosti ... a mam to ... globalData ... nwm

alefo

Re: Java a medzi-threadova komunikácia
« Odpověď #2 kdy: 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.

pssp

Re: Java a medzi-threadova komunikácia
« Odpověď #3 kdy: 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)

podlesh

Re: Java a medzi-threadova komunikácia
« Odpověď #4 kdy: 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.


Palacka

Re: Java a medzi-threadova komunikácia
« Odpověď #5 kdy: 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 :)

podlesh

Re: Java a medzi-threadova komunikácia
« Odpověď #6 kdy: 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).

alefo

Re: Java a medzi-threadova komunikácia
« Odpověď #7 kdy: 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?

pssp

Re: Java a medzi-threadova komunikácia
« Odpověď #8 kdy: 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.