Ich versuche, einen einfachen Code zum Drucken von Zahlen in Folge zu schreiben. Szenario ist wie3 Threads Drucken von Zahlen in Folge
Thread Number
T1 1
T2 2
T3 3
T1 4
T2 5
T3 6
T1 7
T2 8
T3 9
...and so on.
Hier die
istpublic class ThreadNumberPrinter {
Object monitor = new Object();
AtomicInteger number = new AtomicInteger(1);
public static void main(String[] args) {
ThreadNumberPrinter tnp = new ThreadNumberPrinter();
Thread t1 = new Thread(tnp.new Printer(1, 3));
Thread t2 = new Thread(tnp.new Printer(2, 3));
Thread t3 = new Thread(tnp.new Printer(3, 3));
t3.start();
t1.start();
t2.start();
}
class Printer implements Runnable {
int threadId;
int numOfThreads;
public Printer(int id, int nubOfThreads) {
threadId = id;
this.numOfThreads = nubOfThreads;
}
public void run() {
print();
}
private void print() {
try {
while (true) {
Thread.sleep(1000l);
synchronized (monitor) {
if (number.get() % numOfThreads != threadId) {
monitor.wait();
} else {
System.out.println("ThreadId [" + threadId
+ "] printing -->"
+ number.getAndIncrement());
monitor.notifyAll();
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Aber gerade nach dem 2. Thread ausgeführt und druckt die Nummer 2, erhält all Thread in der Warte Bühne und nichts wird gedruckt. Ich bin mir nicht sicher, wo ich falsch liege. Jede Hilfe würde sehr geschätzt werden.
Dies kann eine nützliche Übung sein, um zu lernen, wie man Threads synchronisiert, aber es ist ein schlechtes Beispiel dafür, wie Threads verwendet werden sollen.Jedes Mal, wenn ein Programm eine Anzahl von Operationen muss in einer bestimmten Reihenfolge, die beste Art und Weise, es zu tun durchgeführt wird, ist _one_ Thread zu haben, den die Dinge in dieser Reihenfolge tut. Wenn Ihr Programm _effective USE_ von Threads macht, wird es Dinge geschehen, wo das Programm nicht wissen kann, und kümmert sich nicht um die Reihenfolge, in der sie auftreten. –
wird ReentrantLock in diesem Szenario einen Vorteil gegenüber synchronisiert haben? –