[Java lista] szalkezeles
Maglódszki Viktor
bocios at citromail.hu
2007. Jan. 29., H, 13:19:28 CET
Előszőr is köszi a tanulságos levelet!
Azért még mielött elolvasom azt a 40 oldalt, ha nem haragszol irok...
tehát ha a Thread-ből származtatok akkor nem kell start()
ha implementálom a runnable interface-t akkor kell ?
ha ez utobbi, akkor a start metódus mehet igy?
Thread szal;
public void start() {
if (szal == null) szal = new Thread(this);
}
visszatérve erre:
> public void run() {
> if (futhat) {
> HashMap hm = itt kap SOAP-on egy HashMap-et
>....
> mystopp();
> }
itt leirtam, hogy:
int i = 0;
while (it.hasNext) {
String partnerName = (String)hm.get("partnername");
String id = (String)hm.get("id");
table.setValue(id,0,i);
table.setValue(partnerName,1,i);
i++;
}
tehát igenis végig megy ez a ciklus a hashmap-en és az összes adatok ki is
olvassa !
utána futhat = false kilép és jó is
"Annak, hogy egy metodus igy allitsa le a futasat, nem sok ertelme van.
Most oszinten: a mystopp-ban beallitod a futhat valtozot false-ra. Ki
ellenorzi
ezt, es mikor?"
hát debug szerint ellenörzésre kerül
lefut a ciklus jön a futhat = false;
ezután felugrik az if (futhat) sorhoz ilyenkor már false ezért nem is ugrik
bele!
tehát azért mégis csak működik!
"(egyszer valakinek hozza kell
nyulnia, belenez, es letori a kezed"
remek... :))
"Mar ha azt akarod, hogy a Listazo folyamatosan fusson, mert ez
nem derult ki, de gondolom igy van"
ok ha ez nem derült ki akkor:
a Listazo egyszer fut le ezért van az if (futhat) -ban a while(i.hasNext)
lefut a ciklus kész a tábla és a Listazo nem kell utana.. majd ha megint
megnyomja a gombot valaki..
----- Original Message -----
From: <Laszlo.Marai at nokia.com>
To: <javalist at javagrund.hu>
Sent: Monday, January 29, 2007 12:52 PM
Subject: Re: [Java lista] szalkezeles
Hali!
> Pár napja emlitettem egy szálkezeléssel kapcsolatos problémát.
> Sajnos azóta sem jutottam elöbb.
Mi meg valaszoltunk is. En biztosan. Es irtam, hogy szinkronizacios
problemarol van szo. Sot, mar hetekkel ezelott megirtuk tobben
is (azota nyuglodsz ugyanis ezzel a kerdessel). Arra is emlekszem,
hogy megneztem neked a Kek konyvben (mert azt hasznalod), hogy 40
oldalt kene elolvasnod, ami nem lehet tobb 3-4 oranal. Ehhez kepest
hetek ota vacakolsz.
Es legyszi probalj mar meg nem HTML levelet kuldeni.
> public class Listaz extends Thread {
Egy apro tanacs: az osztaly nevek fonevek szoktak lenni.
Ha mar ragaszkodunk a magyarhoz, akkor Listazo.
> private boolean futhat;
> public Listaz() {
> futhat = true;
> }
> public void start() {
> if (t == null) {
> t = new Thread(this);
> t.setPriority(Thread.MAX_PRIORITY);
> }
> t.start();
> }
Ez tok rossz. (Gondolom a t a Listaz-ban van definialva, csak
lemaradt a bemasolt kodbol.) Mukodik, meg mukodhetne jol is,
csak nem erted az egeszet. A Listaz foloslegesen szarmazik a Thread-bol
(altalaban erre nincs szukseg, es nem is jo gyakorlat), mert folulcsapod
a start metodusat. Ha a Thread-bol szarmaztatsz, akkor eleg a run
metodust implementalni, az orokolt start metodus elintezi a run
futtatasat. Te azt csinalod, hogy letrehozol egy Thread objektumot
(egy Listaz-t - ugye latszik, hogy fonevnek kene lennie), amiben
letrehozol megegy Thread objektumot. Minek?
> public void run() {
> if (futhat) {
> HashMap hm = itt kap SOAP-on egy HashMap-et
>....
> mystopp();
> }
Ez teljesen rossz. Eloszor is nem olvastad el a Runnable es a Thread
dokumentaciojat. Ha elolvastad volna, akkor tudnad, hogy a run
egyszer fut le. Tehat ha te sokszor akarsz valamit megcsinalni, akkor
a run-ba egy ciklust kell rakni. A te esetedben (mivel gondolom
periodikusan akarod nyomni azt a SOAP request/feltoltest dolot,
egy while ciklust: while( futhat ) {...
Annak, hogy egy metodus igy allitsa le a futasat, nem sok ertelme van.
Most oszinten: a mystopp-ban beallitod a futhat valtozot false-ra. Ki
ellenorzi
ezt, es mikor?
> mystopp() {
> futhat = false;
> }
> ez önmagában remekül feltölti a táblát...
Veletlen. Erosen baleset veszelyes kod (egyszer valakinek hozza kell
nyulnia, belenez, es letori a kezed ;) ). A helyes megoldas:
public class Listazo implements Runnable {
private boolean running = true;
public void run() {
while( isRunning() ) {
// Csinaljuk, amit kell
}
}
public synchronized isRunning {
return running;
}
public synchronized void stop() {
running = false;
}
}
Inditasa pedig:
Listazo l = new Listazo(...);
new Thread( l );
Leallitas: l.stop();
Mar ha azt akarod, hogy a Listazo folyamatosan fusson, mert ez
nem derult ki, de gondolom igy van. Hazi feladat, a synchronized
kulcsszo jelentese, es megfejteni, hogy miert van ra szukseg.
> lefutás után (netbeans profilerből is látva) a szál megáll tehát nem fut
> tehát sikerül megállitani
> profiler is mutatja ...
Nem allitottal meg semmit, veget ert a run metodus, ezert allt le a szal.
Ha csak egyszer akartad futtatni a feladatot (mondjuk azert,
mert GUI-bol inditottad gombnyomasra es nem akartad, hogy lefagyjon
a UI, amig dolgozol), akkor minden "if futhat" buveszkedes nelkul eleg
a run metodust megirni.
Ne felejtsuk el, hogy a kodod ettol meg nem lesz jo, mert nem szinkronizalod
a hozzaferest a tablazathoz (vagy mihez, amibe az adatokat toltod ket
szalbol
is). Amig azt nem csinalod meg, nem lesz jo a programod, akkor sem, ha
sikerul
egymas utan 100x vagy 1000x a sajat gepeden jol lefuttatnod _veletlenul_.
> CheckTask task = new CheckTask();
> Timer t = new Timer();
> t.schedule(task,1000,10000); //10mp-kent fut!
> a CheckTask-ban 1 SOAP lekeres van szinten..
> public class CheckTask extends TimerTask {
> if (szal == null) {
> szal = new Thread(this);
Ez mar megint minek? Nem fut le 10 mp alatt a keres? Es ha nem, akkor azt
akarod, hogy
parhuzamosan elinduljon megegy? Mert ha nem, akkor minek megegy szalat
inditani?
> szal.setPriority(Thread.MIN_PRIORITY);
> szal.yield(); //hátha igy elengedi a feltöltő szálat ami eleve
> nagyobb prioritással bir
Nem csinal semmit a yield, mivel meg nem fut a szalad.
> }
> szal.start();
> }
> public void run() {
> futhat = true; //azert itt true mert a timer ezt hivja meg 10mp-ként és
> nem a start()-ot
> if (futhat) {
Ennek szerinted oszinten mi ertelme van? Beallitasz egy private valtozot az
N. sorban, es utana
megvizsgalod az erteket az N+1-ben. Ki valtoztatta volna meg? Es ha kivulrol
(masik
szalbol) meg lehet valtoztatni, akkor miert nem sziknronizalt a hozzaferes?
(De
ertelme akkor se nagyon lenne az egesznek.)
Olvasd mar el azt a nyomorult konyvet, vagy legalabb azt a szerencsetlen 40
oldalt!
Abban minden benne van (szalak, parhuzamossag, szinkronizacio). A TimerTask
nincs
benne, de mindegy is, mert az nem alapkoncepcio, es ugy am block az egeszet
nem erted.
Ha elolvastad, _utana_ kerdezz. Minek irjunk neked konyvet online?
Ba'ly,
Atleta
_______________________________________________
Javalist mailing list
Javalist at javagrund.hu
http://javagrund.hu/mailman/listinfo/javalist
--
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.432 / Virus Database: 268.17.12/655 - Release Date: 2007.01.28.
13:12
További információk a(z) Javalist levelezőlistáról