/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Threads og wait
Fra : Hans Hvelplund Odbor~


Dato : 13-12-00 17:52

hvis man kører wait() i en traad skulle den så ikke stoppe med at køre?



 
 
Ulrik Magnusson (13-12-2000)
Kommentar
Fra : Ulrik Magnusson


Dato : 13-12-00 19:07

> hvis man kører wait() i en traad skulle den så ikke stoppe med at køre?

Hvad sker der og hvordan ser koden ud?

Ulrik Magnusson


Hans Hvelplund Odbor~ (13-12-2000)
Kommentar
Fra : Hans Hvelplund Odbor~


Dato : 13-12-00 20:28


TO METODER I KLASSEN TRANSMITTER
public void run()
{
while (okToRun)
{
while (!threadSuspended&&!okToCount)
{
/*do stuff*/
}
try
{
Thread.currentThread().sleep(10);
if (threadSuspended&&okToCount)
{
System.out.println(this+": I've decided to wait");
synchronized (this)
{
while (threadSuspended&&okToCount)
{
wait();
threadSuspended=true;
}
}
}
}
}

public synchronized void switchOn(boolean on)
{
threadSuspended =!on;
okToCount=!on;
if (on)
{
System.out.println(this+": I'm notified");
notify();
}
else
{
System.out.println(this+": I'm sleeping");
}
}

}

DEL AF EN METODEN public void run() I KLASEN NETWORK:
if (/*et eller andet udtryk*/)
{
System.out.println(getTransmitter(c)+": Network is awakeing me");
getTransmitter(c).switchOn(true);
}
else
{
System.out.println(getTransmitter(c)+": Network is suspending me");
getTransmitter(c).switchOn(false);
}

tilsyneladende (efter noget test at lade run() i network gøre ingenting når
/*et eller andet udtryk*/ er true/false) får tråden i klassen Transmitter
en notify() når /*et eller andet udtryk*/ er false og kommandoen
getTransmitter(c).switchOn(false);
uden denne linie bliver objekter af Transmitter ved med at være i wait
med denne linie vågner de efter et stykke tid.

bliver udført




Thomas Sejr Jensen (13-12-2000)
Kommentar
Fra : Thomas Sejr Jensen


Dato : 13-12-00 19:07

Jo. Har du husket try-catch? Og er du sikker på at den ikke kommer i
catch-sætningen, evt. på grund af en IllegalMonitorStateException?
"Hans Hvelplund Odborg" <hhod00@control.auc.dk> skrev i en meddelelse
news:6PNZ5.12025$72.198145@twister.sunsite.auc.dk...
> hvis man kører wait() i en traad skulle den så ikke stoppe med at køre?
>
>



Dennis Thrysøe (14-12-2000)
Kommentar
Fra : Dennis Thrysøe


Dato : 14-12-00 08:18

wait() bruges til at vente på, at det objekt du kalder den på bliver
notified (notify()). Du skal nok nærmere bruke Thread.sleep().

-dennis

Hans Hvelplund Odborg wrote:

> hvis man kører wait() i en traad skulle den så ikke stoppe med at køre?


Hans Hvelplund Odbor~ (14-12-2000)
Kommentar
Fra : Hans Hvelplund Odbor~


Dato : 14-12-00 15:06

men der er ikke noget der hedder sleep() (ja der sleep(....) men jeg ikke
intresseret i at tråden skal kunne vågne af sig selv, når tiden er udløbet)
jeg vil jo have tråden til at "waite" indtil den anden tråd giver besked



N/A (15-12-2000)
Kommentar
Fra : N/A


Dato : 15-12-00 09:04



Morten Nedertoft (15-12-2000)
Kommentar
Fra : Morten Nedertoft


Dato : 15-12-00 09:04

Dennis Thrysøe wrote:
>
> I så fald er wait korrekt. Du laver noget a la:
>
> synchronized (objectToWaitFor){
> objectToWaitFor.wait();
> )
>
> Herefter kalder du bare fra din anden tråd objectToWaitFor.notify() -
> husk at dette objekt kun skal bruges til at synkronizere et sted i dit
> program. Medmindre du har MEGET styr over hvad der sker ;)

Er det da ikke det han (Hans) har lavet?

mvh. Morten N

Dennis Thrysøe (15-12-2000)
Kommentar
Fra : Dennis Thrysøe


Dato : 15-12-00 10:06

Det er muligt. Hvis det ikke virker kunne det så være fordi det object
der ventes på allerede er blevet notified.

Men ret skal være ret - trådprogrammering kan være en ualimndelig stor
hovedpine en gang imellem.

-dennis


Morten Nedertoft wrote:

> Dennis Thrysøe wrote:
>
>
>> I så fald er wait korrekt. Du laver noget a la:
>
>>
>
>> synchronized (objectToWaitFor){
>
>> objectToWaitFor.wait();
>
>> )
>
>>
>
>> Herefter kalder du bare fra din anden tråd objectToWaitFor.notify() -
>
>> husk at dette objekt kun skal bruges til at synkronizere et sted i dit
>
>> program. Medmindre du har MEGET styr over hvad der sker ;)
>
>
>
> Er det da ikke det han (Hans) har lavet?
>
>
>
> mvh. Morten N


Sven Nielsen (14-12-2000)
Kommentar
Fra : Sven Nielsen


Dato : 14-12-00 19:04

In article <6PNZ5.12025$72.198145@twister.sunsite.auc.dk>,
hhod00@control.auc.dk says...

> hvis man kører wait() i en traad skulle den så ikke stoppe med at køre?

Object.wait() kan kun kaldes af en tråd, der er inde i en monitor (dvs.
et "synchronized" område). Herved stopper tråden og monitoren frigives.

Tråden kan først køre igen når en anden tråd har kaldt Object.notify()
eller Object.notifyAll(), eller når tråden får et Thread.interrupt(),
eller hvis Object.wait(long timeout) udløber.

Object.wait() bruges til at sikre korrekthed af flertrådede programmer,
og ikke til at lave pauser i programudførslen. Her skal Thread.sleep(long
millis) bruges.

Med venlig hilsen Sven.

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste