[Java lista] szalkezeles

Zoltan Mozes Zoltan_Mozes at epam.com
2007. Jan. 29., H, 13:36:13 CET


Complete Java(r) 2
Certification: Study Guide,
Fifth Edition
Philip Heller
Simon Roberts
SYBEX(r)

Chapter 7

"Exam Essentials

Know how to write and run code for a thread by extending java.lang.Thread. Extend the
Thread class, overriding the run() method. Create an instance of the subclass and call its
start() method to launch the new thread.

Know how to write and run code for a thread by implementing the interface java.lang
.Runnable. Create a class that implements Runnable. Construct the thread with the
Thread(Runnable) constructor and call its start() method.

Know the mechanisms that suspend a thread's execution. These mechanisms include entering
any synchronized code or calling wait(), yield(), or sleep().

Recognize code that might cause deadly embrace. Deadlock conditions cause permanent
suspension of threads, and deadly embrace is the classic example of this.

Understand the functionality of the wait(), notify(), and notifyAll() methods.
The wait() method puts the current thread in the current object's Waiting state. The
notify() method arbitrarily moves one thread out of the current object's Waiting state.
The notifyAll() method moves all threadd out of the current object's Waiting state.

Know that the resumption order of threads that execute wait() on an object is not specified.
The Java specification states that the resumption order for threads waiting on an object is
unspecified."

Best Regards,
Zoltán Mózes


EPAM Systems
Budapest office, Hungary (GMT+1)

Office phone:        +36 (1) 327-74-XX
Office fax:            +36 (1) 327-74-20
Mobile phone:       +36 (20) XXX-XXX
E-mail:                 Zoltan_Mozes at epam.com

http://www.epam.com

CONFIDENTIALITY CAUTION AND DISCLAIMER
This message is intended only for the use of the individual(s) or entity(ies) to which it is addressed and contains information that is legally privileged and confidential. If you are not the intended recipient, or the person responsible for delivering the message to the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited. All unintended recipients are obliged to delete this message and destroy any printed copies.

-----Original Message-----
From: javalist-bounces at javagrund.hu [mailto:javalist-bounces at javagrund.hu] On Behalf Of Maglódszki Viktor
Sent: Monday, January 29, 2007 1:19 PM
To: javalist at javagrund.hu
Subject: Re: [Java lista] szalkezeles

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


_______________________________________________
Javalist mailing list
Javalist at javagrund.hu
http://javagrund.hu/mailman/listinfo/javalist


További információk a(z) Javalist levelezőlistáról