Ich möchte Multithreading (Low-Level-Threading) verwenden, aber ich stehe auf ein Problem. Das Problem ist, dass wegen mindestens warten Methode von einem Thread aufgerufen wird und notifyAll von einem anderen Thread aufgerufen wird, das Problem ist, dass jedes Mal, wenn ich das Programm ausführen, scheint es mir, dass notifyAll vor warten aufgerufen wird, so ich werde ewig warten ".Wie funktioniert die Interaktion mit Threads?
Mein Code ist wie folgt:.
public class Reader extends Thread {
Calculator c;
public Reader(Calculator cal) {
c=cal;
}
public void run(){
synchronized(c) {
try {
System.out.println("Waiting for calculation");
c.wait();
} catch (InterruptedException ex) {}
System.out.println("Total is:" +c.total);
}
}
public static void main (String[] a) {
Calculator calculator=new Calculator();
new Reader(calculator).start();
new Reader(calculator).start();
new Reader(calculator).start();
new Reader(calculator).start();
new Reader(calculator).start();
}
}
class Calculator implements Runnable {
int total;
public void run() {
synchronized(this) {
for(int i=0;i<100;i++) {
total=total+i;
}
notifyAll();
}
}
}
Was ich hier als Ausgabe 5 Mal in Folge ist für die Berechnung warten, damit ich nie erreichen die Aussage „die Summe ist die Gesamt
I ich versuche es, herauszufinden, wie das Problem zu lösen, aber immer noch nicht eine Lösung zu finden. Wenn jemand eine Ahnung hat, was viel zu tun, wird erkennen, i.
vielen Dank im Voraus
gespeichert Sie meinen Tag ein Mann! –
Ich habe nur eine Frage. Mir ist bewusst, dass jeder Thread der Ausführung als Instanz der Klasse Thread beginnt. Wenn ich also die Thread-Klasse erweitern möchte, so wie ich es mit der Reader-Klasse gemacht habe, um einen Thread zu erstellen (also vom neuen Zustand zum runnable-Zustand des Thread-Objekts überzugehen), machen wir etwas wie folgt: new Reader.start(). So, jetzt frage ich mich, warum mein Code nicht eine neue Instanz von Thread für Rechner-Klasse instanziiert ist, wenn ich einfach neue Reader (Rechner) .start(); Es sieht so aus als müsste es funktionieren, aber es funktioniert offensichtlich. Können Sie mir bitte klar, dass –
@ENIO: Sie haben keinen Thread für den Rechner erstellt. Ich bin nicht klar, worüber du verwirrt bist. Wenn Sie ein Runnable als Konstruktor arg an einen neuen Thread übergeben, führt der Thread diesen Runnable aus. Der Reader überschreibt jedoch die run-Methode von Thread und führt nicht zum Ausführen des Calculators. Es ist besser, den Unterklassen-Thread überhaupt zu vermeiden, er verursacht nur Verwirrung. –