Drucken "Hallo" und "Welt" mehrere Male unter Verwendung von zwei threads in java
Davon ausgehen, dass ein thread "Hello" und anderen Drucke der "Welt". Ich habe es erfolgreich für eine Zeit, wie folgt:
Paket threading;
public class InterThread {
public static void main(String[] args) {
MyThread mt=new MyThread();
mt.start();
synchronized(mt){
System.out.println("Hello");
try {
mt.wait();
i++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyThread extends Thread{
public void run(){
synchronized(this){
System.out.println("World!");
notify();
}
}
}
Wie mache ich es für mehrere Zeit-Druck, sagen wir für 5 mal? Ich versucht, indem Sie für die Schleife um den synchronisierten block, aber keinen nutzen.
- Vielleicht sollten Sie sich Gedanken über zwei Schleifen.
- Vielleicht sollten Sie darüber nachdenken, mit CyclicBarrier.
- Dies ist nicht gewährleistet, dass Sie immer print Hallo Welt! - der Haupt-thread unterbrochen werden könnte zwischen mt.start(); und synchronisiert(mt)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier zwei voneinander abhängige threads, wir brauchen zwei Objekte synchronisieren. Sie könnte eines von vielen Dingen. eine ganze Zahl, ein weiteres Objekt; ein boolescher Wert ein anderes Objekt; beide Objekt; beide Semaphore und so weiter. die Synchronisierung Technik könnte entweder Monitor oder Semaphore, wie Sie möchten, aber Sie müssen zwei sein.
Habe ich modifiziert Ihren code zu verwenden semaphore statt Monitor. Die Semaphore funktioniert mehr transparent. Sehen Sie die acquire-und release passiert. Monitore sind auch höhere Konstrukte. Daher Synchronisiert, arbeitet unter der Haube.
Wenn Sie bequem mit dem folgenden code, dann können Sie wandeln es um Monitore statt.
Hier ist das Ziel zum synchronisieren von threads so, dass wenn man es geschafft hat den anderen. Wenn ich es, es wären 2 threads den gleichen code mit unterschiedlichen Daten. Jeder thread hat seine eigenen Daten (
"Hello"
undtrue
T1,"World"
undfalse
zu t2), und teilen sich eine variableturn
sowie ein separates Sperrobjekt.Bevor Sie beginnen zu versuchen, um es zu fünf Zeiten, die Sie benötigen, um sicherzustellen, dass es mal funktioniert!
Dein code ist nicht gewährleistet, dass Sie immer print Hallo Welt! - der Haupt-thread unterbrochen werden könnte, bevor die Sperre von mt (beachten Sie, dass sperren auf thread-Objekten ist generell keine gute Idee).
Einem Ansatz wird das verallgemeinern zu tun, das viele Male, ist die Verwendung einer atomaren booleschen
C:
Gibt es zwei Threads, und beide hat seine eigenen Daten ("Hallo" und wahr zu ht, "Welt" und false wt), und teilen sich eine variable objturn.
In einfacher Weise kann dies mithilfe
wait()
undnotify()
ohne ein extra Objekt.