Hi
Schon wieder eine Frage zu Threads. Dieses mal zu notify.
Wenn ich mein Buch richtig verstanden habe, weckt nofity einen beliebigen Thread auf, der mittels wait in einen Schlafmodus versetzt wurde. Es muss angeblich nicht unbedingt jener Thread sein, der schon am längsten schläft.
Jetzt wollte ich das ausprobieren mit folgenden Programm:
Aber egal, wie oft ich das Programm starte, der notify weckt immer nur den zuerst angelegten Thread aus seinen Schlafmodus auf. Wie kann ich denn Java dazu bringen, dass mir mal ein beliebig anderer zufällig ausgewählter Thread aufgeweckt wird?
Schon wieder eine Frage zu Threads. Dieses mal zu notify.
Wenn ich mein Buch richtig verstanden habe, weckt nofity einen beliebigen Thread auf, der mittels wait in einen Schlafmodus versetzt wurde. Es muss angeblich nicht unbedingt jener Thread sein, der schon am längsten schläft.
Jetzt wollte ich das ausprobieren mit folgenden Programm:
Java:
class R // von Threads gemeinsam genutzte Resource
{
public synchronized void mWait(String name)
{
System.out.println("wait a "+name); // Ausgabe
try
{
wait();
}
catch(InterruptedException e)
{
System.out.println("wait interrupt "+name);
}
System.out.println("wait b "+name); // Ausgabe
}
public synchronized void mNotify(String name)
{
System.out.println("---------------------notify a "+name); // Ausgabe
notify();
System.out.println("---------------------notify b "+name); // Ausgabe
}
}
class TWait extends Thread // ein Thread, der in den Schlafmodus versetzt wird
{
private R r;
public TWait(R r, String name)
{
super(name);
this.r = r;
}
public void run()
{
r.mWait(getName());
}
}
class TNotify extends Thread // ein Thread, der irgendeinen anderen Thread aus den Schlafmodus holen soll
{
private R r;
public TNotify(R r)
{
this.r = r;
}
public void run()
{
r.mNotify(getName());
}
}
public class Main
{
public static void main(String[] args)
{
R r = new R();
// 100 Wait-Threads:
int size = 100;
TWait[] threads = new TWait[size];
for(int i = 0; i < size; ++i)
{
threads[i] = new TWait(r, Integer.toString(i));
}
for(int i = 0; i < size; ++i) // benötigt 100 * 10 ms = 1000 ms = 1 s
{
threads[i].start();
try
{
Thread.sleep(10); // 10 ms
}
catch(InterruptedException e)
{
System.out.println("sleep interrupt");
}
}
// 1 Notify-Thread:
TNotify t = new TNotify(r);
t.start();
}
}
Aber egal, wie oft ich das Programm starte, der notify weckt immer nur den zuerst angelegten Thread aus seinen Schlafmodus auf. Wie kann ich denn Java dazu bringen, dass mir mal ein beliebig anderer zufällig ausgewählter Thread aufgeweckt wird?
Zuletzt bearbeitet: