Hoi!
Stel je hebt volgende simpele thread class:
Nu twijfel ik over de werking van notify():
- notify() wekt de wait() in het huidige instantie object van myThread; met instantie object bedoel ik dus het object waarop wekNotify() wordt opgeroepen
- notify() wekt de wait() in een willekeurige instantie object van myThread, en niet noodzakelijk de huidige;
Ik wil het volgende maken: ik heb een class Manager en een aantal (onbepaald) Workers. Workers zijn dus threads die 1 of andere operatie uitvoeren in de achtergrond. De Workers zeggen tegen de Manager dat ze klaar zijn om een taak uit te voeren. De Manager reageert hier (eventueel) op door het oproepen van de functie wekNotify(): hetObjectDatKlaarIs.wekNotify(). Hier zit ik dus vast ivm. de semantiek van notify(): wat als 2 Workers zich aangemeld hebben om te werken, de Manager kiest er de beste uit (hij wil dus dat er maar 1 van de 2 Workers gaat werken: de beste), en roept op deze wekNotify() op: besteObjectVanDe2.wekNotify()
-> als notify() de eerste betekenis heeft, is er geen probleem: er is garantie dat de beste Worker de taak toegewezen krijgt, want de wait() van besteObjectVanDe2 wordt gewekt.
-> als notify() de tweede betekenis heeft, is er wel een probleem: er is geen garantie dat de beste Worker de taak toegewezen krijgt, want de wait() van besteObjectVanDe2 wordt niet noodzakelijk gewekt.
Hoe zit dat nu? In de JAVA docs staat:
Ik heb ook een test programmatje gemaakt:
En mijn tweede vraag: als notify() dus willekeurig is (tweede betekenis), hoe kan ik dan garanderen dat het object wordt opgeroepen dat IK wil, en niet wat de thread manager toevallig kiest? Want notify() lijkt hier dan totaal zinloos?
thanks
Stel je hebt volgende simpele thread class:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| public class myThread extends Thread
{
private String m_name;
public myThread(String name)
{
m_name = name;
this.start();
}
public void run()
{
while (true)
runMe();
}
public synchronized void runMe()
{
try
{
wait();
System.out.println("[" + m_name + "] na wait");
}
catch (InterruptedException e)
{
}
}
public synchronized void wekNotify()
{
notify();
}
} |
Nu twijfel ik over de werking van notify():
- notify() wekt de wait() in het huidige instantie object van myThread; met instantie object bedoel ik dus het object waarop wekNotify() wordt opgeroepen
- notify() wekt de wait() in een willekeurige instantie object van myThread, en niet noodzakelijk de huidige;
Ik wil het volgende maken: ik heb een class Manager en een aantal (onbepaald) Workers. Workers zijn dus threads die 1 of andere operatie uitvoeren in de achtergrond. De Workers zeggen tegen de Manager dat ze klaar zijn om een taak uit te voeren. De Manager reageert hier (eventueel) op door het oproepen van de functie wekNotify(): hetObjectDatKlaarIs.wekNotify(). Hier zit ik dus vast ivm. de semantiek van notify(): wat als 2 Workers zich aangemeld hebben om te werken, de Manager kiest er de beste uit (hij wil dus dat er maar 1 van de 2 Workers gaat werken: de beste), en roept op deze wekNotify() op: besteObjectVanDe2.wekNotify()
-> als notify() de eerste betekenis heeft, is er geen probleem: er is garantie dat de beste Worker de taak toegewezen krijgt, want de wait() van besteObjectVanDe2 wordt gewekt.
-> als notify() de tweede betekenis heeft, is er wel een probleem: er is geen garantie dat de beste Worker de taak toegewezen krijgt, want de wait() van besteObjectVanDe2 wordt niet noodzakelijk gewekt.
Hoe zit dat nu? In de JAVA docs staat:
Dus mag ik hieruit besluiten dat notify() de tweede betekenis heeft, en eender welk object kan wakker maken?Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at the discretion of the implementation. A thread waits on an object's monitor by calling one of the wait methods.
Ik heb ook een test programmatje gemaakt:
code:
Ik heb het zeker 50 keer uitgevoerd, en altijd was de volgorde: 1, 2, 3. Is dat dan toeval? Want hier wekt threadx.wekNotify() altijd de wait() in threadx, en dat wil ik nu net!1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| public class Main
{
public static void main(String[] args)
{
myThread thread1 = new myThread("Thread 1");
myThread thread2 = new myThread("Thread 2");
myThread thread3 = new myThread("Thread 3");
/* notify */
try { Thread.sleep(1000); } catch (InterruptedException e) { }
thread1.wekNotify();
try { Thread.sleep(1000); } catch (InterruptedException e) { }
thread2.wekNotify();
try { Thread.sleep(1000); } catch (InterruptedException e) { }
thread3.wekNotify();
}
} |
En mijn tweede vraag: als notify() dus willekeurig is (tweede betekenis), hoe kan ik dan garanderen dat het object wordt opgeroepen dat IK wil, en niet wat de thread manager toevallig kiest? Want notify() lijkt hier dan totaal zinloos?
thanks
[ Voor 3% gewijzigd door Verwijderd op 15-10-2003 17:41 ]