Commit 739e83fa by Patryk Czarnik

Synchronizacja kont - v0

parent 6d087373
package p28_watki.b_synchro.v0_brak;
public class BrakSrodkow extends Exception {
private static final long serialVersionUID = 5262944731342409658L;
public BrakSrodkow() {
super();
}
public BrakSrodkow(String message) {
super(message);
}
}
package p28_watki.b_synchro.v0_brak;
class Konto {
private final int numer;
private int saldo;
private Osoba wlasciciel;
public Konto(int numer, int saldo, Osoba wlasciciel) {
this.numer = numer;
this.saldo = saldo;
this.wlasciciel = wlasciciel;
}
public Osoba getWlasciciel() {
return wlasciciel;
}
public void setWlasciciel(Osoba wlasciciel) {
this.wlasciciel = wlasciciel;
}
public int getNumer() {
return numer;
}
public int getSaldo() {
return saldo;
}
public String toString() {
return "Konto nr " + numer + ", saldo: " + saldo + ", wł.: " + wlasciciel;
}
public void wplata(int kwota) {
if(kwota < 0) {
throw new IllegalArgumentException("Ujemna kwota " + kwota + " we wpłacie");
}
saldo += kwota;
}
public void wyplata(int kwota) throws BrakSrodkow {
if(kwota < 0) {
throw new IllegalArgumentException("Ujemna kwota " + kwota + " w wypłacie");
}
if(kwota > saldo) {
throw new BrakSrodkow("Brak środków na koncie nr " + numer);
}
saldo -= kwota;
}
}
package p28_watki.b_synchro.v0_brak;
import java.time.LocalDate;
import java.time.Period;
class Osoba {
private String imie, nazwisko;
private LocalDate dataUrodzenia;
public Osoba() {
}
Osoba(String imie, String nazwisko) {
this.imie = imie;
this.nazwisko = nazwisko;
}
public Osoba(String imie, String nazwisko, LocalDate dataUrodzenia) {
this.setImie(imie);
this.nazwisko = nazwisko;
this.dataUrodzenia = dataUrodzenia;
}
public Osoba(String imie, String nazwisko, String dataUrodzenia) {
// wywołanie innego konstruktora z tej samej klasy
this(imie, nazwisko, LocalDate.parse(dataUrodzenia));
}
public int obliczWiek() {
LocalDate dzisiaj = LocalDate.now();
Period wiek = Period.between(dataUrodzenia, dzisiaj);
return wiek.getYears();
}
@Override
public String toString() {
return imie + " " +nazwisko + " ur." + dataUrodzenia;
}
public String kimJestes() {
return "Jestem osobą";
}
public String getImie() {
return imie;
}
public String getNazwisko() {
return nazwisko;
}
public LocalDate getDataUrodzenia() {
return dataUrodzenia;
}
public void setImie(String imie) {
if(imie == null || imie.isEmpty()) {
throw new IllegalArgumentException("imię nie może być puste");
}
this.imie = imie;
}
public void setNazwisko(String nazwisko) {
this.nazwisko = nazwisko;
}
}
package p28_watki.b_synchro.v0_brak;
import java.time.LocalDate;
class Przeploty {
public static void main(String[] args) {
final int N = 100_000;
final int KWOTA = 10;
Osoba ala = new Osoba("Ala", "Kowalska", LocalDate.now());
Konto konto = new Konto(1, 1000000, ala);
System.out.println(konto);
Thread wplacacz = new Thread(() -> {
for(int i = 0 ; i < N; i++) {
konto.wplata(KWOTA);
}
});
Thread wyplacacz = new Thread(() -> {
for(int i = 0; i < N; i++) {
try {
konto.wyplata(KWOTA);
} catch (BrakSrodkow e) {
System.err.println(e.getMessage());
}
}
});
System.out.println("Uruchamiam wątki");
wplacacz.start();
wyplacacz.start();
System.out.println("Czekam na zakończenie");
try {
wplacacz.join();
wyplacacz.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Wątki zakończone, konto na końcu:");
System.out.println(konto);
}
}
package p28_watki.b_synchro.v0_brak;
import java.io.IOException;
class WyplacanieBezOczekiwania {
static volatile boolean koniec = false;
public static void main(String[] args) {
final Osoba ala = new Osoba("Ala", "Kowalska", "2001-01-01");
final Konto konto = new Konto(1, 1700, ala);
System.out.println("początek " + konto);
Thread wplacacz = new Thread(new Runnable() {
public void run() {
while (!koniec) {
konto.wplata(1000);
System.out.println("wpłacacz: wpłaciłem 1000, saldo = " + konto.getSaldo());
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
}
}
}
});
Thread wyplacacz = new Thread(new Runnable() {
public void run() {
while (!koniec) {
try {
konto.wyplata(100);
} catch (BrakSrodkow e) {
System.err.println("BRAK ŚRODKÓW");
}
System.out.println("wypłacacz: wypłaciłem 100, saldo = " + konto.getSaldo());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
}
}
});
wplacacz.start();
wyplacacz.start();
System.out.println("Wątki wystartowały");
System.out.println("Naciśnij enter aby zakończyć");
try {
System.in.read();
} catch (IOException e1) {
}
koniec = true;
try {
wplacacz.join();
wyplacacz.join();
} catch (InterruptedException e) {
System.err.println("INTERRUPTED");
}
System.out.println("na końcu: " + 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