Commit 77248684 by Patryk Czarnik

wait i notify

parent 28c2fba2
......@@ -42,6 +42,7 @@ public class Konto {
throw new IllegalArgumentException("Niedodatnia kwota w metodzie wplata");
}
saldo += kwota;
notify();
}
// W tej wersji metoda w razie braku środków wyrzuca wyjątek
......@@ -55,4 +56,22 @@ public class Konto {
saldo -= kwota;
}
// W tej wersji metoda w razie braku środków CZEKA
public synchronized void wyplataCzekaj(int kwota) {
if(kwota <= 0) {
throw new IllegalArgumentException("Niedodatnia kwota w metodzie wyplata");
}
try {
// zazwyczaj wait umieszcza się w while, aby obudzony wątek sprawdził jeszcze raz czy warunek, na który czekał, naprawdę jest już spełnione
// w tym przypadku czy wpłacona kwota jest wystarczająca
while(kwota > saldo) {
wait();
}
saldo -= kwota;
notify(); // budzenie kaskadowe
} catch (InterruptedException e) {
// właściwa praktyka: w przypadku InterruptedException nie należy zmieniać już stanu obiektu
}
}
}
package watki.konto;
public class Zycie {
public static void main(String[] args) {
Konto konto = new Konto(1, "Ala Kowalska", 12000);
System.out.println(konto);
Thread wplacacz = new Thread(() -> {
for(int i = 0; i < 1000; i++) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
konto.wplata(10000);
System.out.println("wpłacone, teraz jest " + konto.getSaldo());
}
});
Thread wyplacacz = new Thread(() -> {
for(int i = 0; i < 100_000; i++) {
try {
Thread.sleep(550);
} catch (InterruptedException e) {
}
try {
konto.wyplataCzekaj(2500);
System.out.println("wypłacone, teraz jest " + konto.getSaldo());
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
});
wplacacz.start();
wyplacacz.start();
try {
wplacacz.join();
wyplacacz.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(konto);
}
}
package watki.konto;
public class Zycie_BezSynchonizacji {
public static void main(String[] args) {
Konto konto = new Konto(1, "Ala Kowalska", 12000);
System.out.println(konto);
Thread wplacacz = new Thread(() -> {
for(int i = 0; i < 1000; i++) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
konto.wplata(10000);
System.out.println("wpłacone, teraz jest " + konto.getSaldo());
}
});
Thread wyplacacz = new Thread(() -> {
for(int i = 0; i < 100_000; i++) {
try {
Thread.sleep(550);
} catch (InterruptedException e) {
}
try {
konto.wyplata(2500);
System.out.println("wypłacone, teraz jest " + konto.getSaldo());
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
});
wplacacz.start();
wyplacacz.start();
// oczekiwanie na zakończenie wątku - operacja join
try {
wplacacz.join();
wyplacacz.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(konto);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment