Wenn Sie sich den Code für das Refactoring ansehen Ich habe es mehrmals gesehen und etwas gefunden, das ich vergessen habe, also habe ich mir eine Notiz gemacht, damit ich es nicht vergesse.
synchronisiert
bedeutet exklusive Kontrolle ,
Exklusive Kontrolle = Verhindert, dass mehrere Prozesse (oder Threads) gleichzeitig eingegeben werden
Es scheint.
Weil es nicht nur mit Worten gut kam Ich habe es direkt versucht.
Als Prämissenbild Es ist das Bild einer Familie, die nacheinander ein Bad nimmt. (Geben Sie nicht ein, bis eine Person fertig ist.)
"Hauptklasse mit Hauptmethode"
MainClass.java
public class MainClass {
public static void main(String[] args) {
Bathroom bathroom = new Bathroom();
FamilyTread father = new FamilyTread(bathroom, "Vater");
FamilyTread mother = new FamilyTread(bathroom, "Mutter");
FamilyTread sister = new FamilyTread(bathroom, "Schwester");
FamilyTread me = new FamilyTread(bathroom, "ich");
father.start();
mother.start();
sister.start();
me.start();
}
}
"Klasse für Familien, die" Thread "erben" "
FamilyTread.java
class FamilyTread extends Thread {
private Bathroom mBathroom;
private String mName;
FamilyTread(Bathroom bathroom, String name) {
this.mBathroom = bathroom;
this.mName = name;
}
public void run() {
mBathroom.openDoor(mName);
}
}
"Eine Klasse, die von einer Familienklasse zur Arbeit gerufen wurde"
class Bathroom {
void openDoor(String name) {
System.out.println(name + ""Ich werde ein Bad nehmen!"");
for (int count = 0; count < 100000; count++) {
if (count == 1000) {
System.out.println(name + ""Ich habe ein Bad genommen."");
}
}
System.out.println(name + ""Ich bin aus dem Bad gestiegen!"");
}
}
Mein Vater nimmt immer noch ein Bad ...! Die Bestellung wurde durcheinander gebracht. (Es ist zufällig in der richtigen Reihenfolge)
Daher kann die Verwendung von "synchronisiert" verhindern, dass Sie gleichzeitig ein Bad (Faden) nehmen.
Ich habe "synchronized" zur "openDoor" -Methode der "Bathroom" -Klasse hinzugefügt.
class Bathroom {
synchronized void openDoor(String name) {
System.out.println(name + ""Ich werde ein Bad nehmen!"");
for (int count = 0; count < 100000; count++) {
if (count == 1000) {
System.out.println(name + ""Ich habe ein Bad genommen."");
}
}
System.out.println(name + ""Ich bin aus dem Bad gestiegen!"");
}
}
Sie können jetzt eins nach dem anderen eingeben!
http://www.techscore.com/tech/Java/JavaSE/Thread/3/
Recommended Posts