Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
alx_20251009
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Patryk Czarnik
alx_20251009
Commits
bf783d1a
Commit
bf783d1a
authored
Oct 09, 2025
by
Patryk Czarnik
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Wątki - gotowe wersje przykładu Konto
parent
ce2aed00
Hide whitespace changes
Inline
Side-by-side
Showing
39 changed files
with
2174 additions
and
0 deletions
+2174
-0
BrakSrodkow.java
...a/p04_watki/konta/v1_brak_synchronizacji/BrakSrodkow.java
+13
-0
Konto.java
...in/java/p04_watki/konta/v1_brak_synchronizacji/Konto.java
+55
-0
Osoba.java
...in/java/p04_watki/konta/v1_brak_synchronizacji/Osoba.java
+66
-0
Przeploty.java
...ava/p04_watki/konta/v1_brak_synchronizacji/Przeploty.java
+47
-0
WyplacanieBezOczekiwania.java
...onta/v1_brak_synchronizacji/WyplacanieBezOczekiwania.java
+66
-0
BrakSrodkow.java
.../p04_watki/konta/v2_synchronizacja_metod/BrakSrodkow.java
+13
-0
Konto.java
...n/java/p04_watki/konta/v2_synchronizacja_metod/Konto.java
+90
-0
Konto_Niepoprawnie.java
...tki/konta/v2_synchronizacja_metod/Konto_Niepoprawnie.java
+71
-0
Osoba.java
...n/java/p04_watki/konta/v2_synchronizacja_metod/Osoba.java
+66
-0
Przeploty.java
...va/p04_watki/konta/v2_synchronizacja_metod/Przeploty.java
+48
-0
WyplacanieBezOczekiwania.java
...nta/v2_synchronizacja_metod/WyplacanieBezOczekiwania.java
+66
-0
WyplacanieZOczekiwaniem.java
...onta/v2_synchronizacja_metod/WyplacanieZOczekiwaniem.java
+63
-0
BrakSrodkow.java
...p04_watki/konta/v3_synchronizacja_blokow/BrakSrodkow.java
+13
-0
Konto.java
.../java/p04_watki/konta/v3_synchronizacja_blokow/Konto.java
+77
-0
Osoba.java
.../java/p04_watki/konta/v3_synchronizacja_blokow/Osoba.java
+66
-0
Przeploty.java
...a/p04_watki/konta/v3_synchronizacja_blokow/Przeploty.java
+48
-0
WyplacanieBezOczekiwania.java
...ta/v3_synchronizacja_blokow/WyplacanieBezOczekiwania.java
+65
-0
WyplacanieBezOczekiwaniaAtomicBoolean.java
...nizacja_blokow/WyplacanieBezOczekiwaniaAtomicBoolean.java
+68
-0
WyplacanieZOczekiwaniem.java
...nta/v3_synchronizacja_blokow/WyplacanieZOczekiwaniem.java
+62
-0
BrakSrodkow.java
src/main/java/p04_watki/konta/v4_locki/BrakSrodkow.java
+13
-0
Konto.java
src/main/java/p04_watki/konta/v4_locki/Konto.java
+106
-0
Osoba.java
src/main/java/p04_watki/konta/v4_locki/Osoba.java
+66
-0
Podklasa.java
src/main/java/p04_watki/konta/v4_locki/Podklasa.java
+17
-0
Przeploty.java
src/main/java/p04_watki/konta/v4_locki/Przeploty.java
+48
-0
WyplacanieBezOczekiwania.java
...va/p04_watki/konta/v4_locki/WyplacanieBezOczekiwania.java
+66
-0
WyplacanieZOczekiwaniem.java
...ava/p04_watki/konta/v4_locki/WyplacanieZOczekiwaniem.java
+62
-0
BrakSrodkow.java
src/main/java/p04_watki/konta/v5_semafor/BrakSrodkow.java
+13
-0
Konto.java
src/main/java/p04_watki/konta/v5_semafor/Konto.java
+102
-0
Osoba.java
src/main/java/p04_watki/konta/v5_semafor/Osoba.java
+66
-0
Podklasa.java
src/main/java/p04_watki/konta/v5_semafor/Podklasa.java
+17
-0
Przeploty.java
src/main/java/p04_watki/konta/v5_semafor/Przeploty.java
+48
-0
WyplacanieBezOczekiwania.java
.../p04_watki/konta/v5_semafor/WyplacanieBezOczekiwania.java
+66
-0
WyplacanieZOczekiwaniem.java
...a/p04_watki/konta/v5_semafor/WyplacanieZOczekiwaniem.java
+62
-0
BrakSrodkow.java
.../v6_synchronizacja_na_zwyklych_obiektach/BrakSrodkow.java
+13
-0
Konto.java
.../konta/v6_synchronizacja_na_zwyklych_obiektach/Konto.java
+100
-0
Osoba.java
.../konta/v6_synchronizacja_na_zwyklych_obiektach/Osoba.java
+66
-0
Przeploty.java
...ta/v6_synchronizacja_na_zwyklych_obiektach/Przeploty.java
+48
-0
WyplacanieBezOczekiwania.java
...zacja_na_zwyklych_obiektach/WyplacanieBezOczekiwania.java
+66
-0
WyplacanieZOczekiwaniem.java
...izacja_na_zwyklych_obiektach/WyplacanieZOczekiwaniem.java
+66
-0
No files found.
src/main/java/p04_watki/konta/v1_brak_synchronizacji/BrakSrodkow.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v1_brak_synchronizacji
;
public
class
BrakSrodkow
extends
Exception
{
private
static
final
long
serialVersionUID
=
5262944731342409658L
;
public
BrakSrodkow
()
{
super
();
}
public
BrakSrodkow
(
String
message
)
{
super
(
message
);
}
}
src/main/java/p04_watki/konta/v1_brak_synchronizacji/Konto.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v1_brak_synchronizacji
;
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
;
}
}
src/main/java/p04_watki/konta/v1_brak_synchronizacji/Osoba.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v1_brak_synchronizacji
;
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
;
}
}
src/main/java/p04_watki/konta/v1_brak_synchronizacji/Przeploty.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v1_brak_synchronizacji
;
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
,
1000_000
,
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
);
}
}
src/main/java/p04_watki/konta/v1_brak_synchronizacji/WyplacanieBezOczekiwania.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v1_brak_synchronizacji
;
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
);
}
}
src/main/java/p04_watki/konta/v2_synchronizacja_metod/BrakSrodkow.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v2_synchronizacja_metod
;
public
class
BrakSrodkow
extends
Exception
{
private
static
final
long
serialVersionUID
=
5262944731342409658L
;
public
BrakSrodkow
()
{
super
();
}
public
BrakSrodkow
(
String
message
)
{
super
(
message
);
}
}
src/main/java/p04_watki/konta/v2_synchronizacja_metod/Konto.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v2_synchronizacja_metod
;
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
synchronized
Osoba
getWlasciciel
()
{
return
wlasciciel
;
}
public
synchronized
void
setWlasciciel
(
Osoba
wlasciciel
)
{
this
.
wlasciciel
=
wlasciciel
;
}
public
int
getNumer
()
{
return
numer
;
}
public
synchronized
int
getSaldo
()
{
return
saldo
;
}
public
synchronized
void
wplata
(
int
kwota
)
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" we wpłacie"
);
}
saldo
+=
kwota
;
notify
();
// System.out.println("I jeszcze coś robię");
// saldo --; // potrącić prowizję
// wątek obudzony z notify musi jeszcze poczekać, aż ja skończę tu robotę
// bo to jeszcze ja zajmuję sekcje "synchronized"
}
public
synchronized
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
;
}
public
synchronized
void
wyplataCzekaj
(
int
kwota
)
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
}
try
{
while
(
kwota
>
saldo
)
{
wait
();
// po obudzeniu (notify) ten wątek na normalnych prawach
// czeka na dostęp do sekcji synchronizowanej
// 1) wątek, który zrobił notify, musi wyjść
// 2) może pojawić się trzeci wątek, który "wepchnie się" do metody synchronizowanej,
// zanim zrobi to TEN wątek obudzony z wait-a
// Również z tego powodu warunek oczekiwania należy sprawdzić ponownie po obudzeniu
// Standardowy zapis - pętla while.
}
saldo
-=
kwota
;
notify
();
// "budzenie kaskadowe"
}
catch
(
InterruptedException
e
)
{
// Taki wyjątek pojawi się gdy podczas gdy wątek A śpi (w wait, sleep itp.)
// inny wątek B wywoła na wątku A metodę interrupt
// Zazwyczaj robi się to, gdy kończy się program albo anuluje wątki, które nie będą potrzebne.
// interrupt nie jest normalnym zakończeniem oczekiwania. Warunek logiczny nie został spełniony
// - w takiej sytuacji nie powinniśmy podejmować akcji zmieniających stan,
// ani nie powinnismy kontynuować czekania.
System
.
err
.
println
(
e
);
}
}
public
String
toString
()
{
return
"Konto nr "
+
getNumer
()
+
", saldo: "
+
getSaldo
()
+
", wł.: "
+
getWlasciciel
();
}
}
src/main/java/p04_watki/konta/v2_synchronizacja_metod/Konto_Niepoprawnie.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v2_synchronizacja_metod
;
class
Konto_Niepoprawnie
{
private
final
int
numer
;
private
int
saldo
;
private
Osoba
wlasciciel
;
public
Konto_Niepoprawnie
(
int
numer
,
int
saldo
,
Osoba
wlasciciel
)
{
this
.
numer
=
numer
;
this
.
saldo
=
saldo
;
this
.
wlasciciel
=
wlasciciel
;
}
public
synchronized
Osoba
getWlasciciel
()
{
return
wlasciciel
;
}
public
synchronized
void
setWlasciciel
(
Osoba
wlasciciel
)
{
this
.
wlasciciel
=
wlasciciel
;
}
public
int
getNumer
()
{
return
numer
;
}
public
synchronized
int
getSaldo
()
{
return
saldo
;
}
public
synchronized
void
setSaldo
(
int
saldo
)
{
this
.
saldo
=
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"
);
}
this
.
setSaldo
(
this
.
getSaldo
()
+
kwota
);
// Nawet jeśli getter i setter są synchronizowane, to powyższy zapis jest niepoprawny
// bo to się tłumaczy na
// int stareSaldo = this.getSaldo();
// int noweSaldo = stareSaldo + kwota;
// W TYM momencie inny wątek może też odczytać saldo, zmienić i zapisać
// this.setSaldo(noweSaldo);
// między getem a setem mogą wejść inne wątki
}
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
);
}
this
.
setSaldo
(
this
.
getSaldo
()
-
kwota
);
}
}
src/main/java/p04_watki/konta/v2_synchronizacja_metod/Osoba.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v2_synchronizacja_metod
;
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
;
}
}
src/main/java/p04_watki/konta/v2_synchronizacja_metod/Przeploty.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v2_synchronizacja_metod
;
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
,
1000_000
,
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
);
}
}
src/main/java/p04_watki/konta/v2_synchronizacja_metod/WyplacanieBezOczekiwania.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v2_synchronizacja_metod
;
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
);
}
}
src/main/java/p04_watki/konta/v2_synchronizacja_metod/WyplacanieZOczekiwaniem.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v2_synchronizacja_metod
;
import
java.io.IOException
;
class
WyplacanieZOczekiwaniem
{
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
{
Thread
.
sleep
(
200
);
}
catch
(
InterruptedException
e
)
{
}
konto
.
wyplataCzekaj
(
100
);
System
.
out
.
println
(
"wypłacacz: wypłaciłem 100, saldo = "
+
konto
.
getSaldo
());
}
}
});
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
;
wplacacz
.
interrupt
();
wyplacacz
.
interrupt
();
try
{
wplacacz
.
join
();
wyplacacz
.
join
();
}
catch
(
InterruptedException
e
)
{
System
.
err
.
println
(
"INTERRUPTED"
);
}
System
.
out
.
println
(
"na końcu: "
+
konto
);
}
}
src/main/java/p04_watki/konta/v3_synchronizacja_blokow/BrakSrodkow.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v3_synchronizacja_blokow
;
public
class
BrakSrodkow
extends
Exception
{
private
static
final
long
serialVersionUID
=
5262944731342409658L
;
public
BrakSrodkow
()
{
super
();
}
public
BrakSrodkow
(
String
message
)
{
super
(
message
);
}
}
src/main/java/p04_watki/konta/v3_synchronizacja_blokow/Konto.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v3_synchronizacja_blokow
;
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
synchronized
Osoba
getWlasciciel
()
{
return
wlasciciel
;
}
public
synchronized
void
setWlasciciel
(
Osoba
wlasciciel
)
{
this
.
wlasciciel
=
wlasciciel
;
}
public
int
getNumer
()
{
return
numer
;
}
public
synchronized
int
getSaldo
()
{
return
saldo
;
}
public
void
wplata
(
int
kwota
)
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" we wpłacie"
);
}
synchronized
(
this
)
{
saldo
+=
kwota
;
this
.
notify
();
}
}
public
void
wyplata
(
int
kwota
)
throws
BrakSrodkow
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
}
// Jeśli mamy warunek i w zależności od warunku zmieniamy dane,
// to warunek i operacja zmiany muszą być RAZEM w jednym bloku synchronizowanym.
synchronized
(
this
)
{
if
(
kwota
>
saldo
)
{
throw
new
BrakSrodkow
(
"Brak środków na koncie nr "
+
numer
);
}
saldo
-=
kwota
;
}
}
public
void
wyplataCzekaj
(
int
kwota
)
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
}
try
{
synchronized
(
this
)
{
while
(
kwota
>
saldo
)
{
this
.
wait
();
}
saldo
-=
kwota
;
this
.
notify
();
}
}
catch
(
InterruptedException
e
)
{
System
.
err
.
println
(
e
);
}
}
public
String
toString
()
{
return
"Konto nr "
+
getNumer
()
+
", saldo: "
+
getSaldo
()
+
", wł.: "
+
getWlasciciel
();
}
}
src/main/java/p04_watki/konta/v3_synchronizacja_blokow/Osoba.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v3_synchronizacja_blokow
;
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
;
}
}
src/main/java/p04_watki/konta/v3_synchronizacja_blokow/Przeploty.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v3_synchronizacja_blokow
;
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
,
1000_000
,
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
);
}
}
src/main/java/p04_watki/konta/v3_synchronizacja_blokow/WyplacanieBezOczekiwania.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v3_synchronizacja_blokow
;
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
);
}
}
src/main/java/p04_watki/konta/v3_synchronizacja_blokow/WyplacanieBezOczekiwaniaAtomicBoolean.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v3_synchronizacja_blokow
;
import
java.io.IOException
;
import
java.util.concurrent.atomic.AtomicBoolean
;
class
WyplacanieBezOczekiwaniaAtomicBoolean
{
static
final
AtomicBoolean
dzialamy
=
new
AtomicBoolean
(
true
);
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
(
dzialamy
.
get
())
{
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
(
dzialamy
.
get
())
{
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
)
{
}
dzialamy
.
set
(
false
);
wplacacz
.
interrupt
();
wyplacacz
.
interrupt
();
try
{
wplacacz
.
join
();
wyplacacz
.
join
();
}
catch
(
InterruptedException
e
)
{
System
.
err
.
println
(
"INTERRUPTED"
);
}
System
.
out
.
println
(
"na końcu: "
+
konto
);
}
}
src/main/java/p04_watki/konta/v3_synchronizacja_blokow/WyplacanieZOczekiwaniem.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v3_synchronizacja_blokow
;
import
java.io.IOException
;
class
WyplacanieZOczekiwaniem
{
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
,
1500
,
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
)
{
konto
.
wyplataCzekaj
(
100
);
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
);
}
}
src/main/java/p04_watki/konta/v4_locki/BrakSrodkow.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v4_locki
;
public
class
BrakSrodkow
extends
Exception
{
private
static
final
long
serialVersionUID
=
5262944731342409658L
;
public
BrakSrodkow
()
{
super
();
}
public
BrakSrodkow
(
String
message
)
{
super
(
message
);
}
}
src/main/java/p04_watki/konta/v4_locki/Konto.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v4_locki
;
import
java.util.concurrent.locks.Condition
;
import
java.util.concurrent.locks.Lock
;
import
java.util.concurrent.locks.ReentrantLock
;
class
Konto
{
private
final
Lock
lock
=
new
ReentrantLock
();
private
final
Condition
czekanieNaKase
=
lock
.
newCondition
();
// można tworzyć osobne condition związane z oczekiwaniem na różne warunki
private
final
Condition
czekanieNaUdzielenieKredytu
=
lock
.
newCondition
();
private
final
int
numer
;
protected
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
()
{
try
{
lock
.
lock
();
return
wlasciciel
;
}
finally
{
lock
.
unlock
();
}
}
public
void
setWlasciciel
(
Osoba
wlasciciel
)
{
try
{
lock
.
lock
();
this
.
wlasciciel
=
wlasciciel
;
}
finally
{
lock
.
unlock
();
}
}
public
int
getNumer
()
{
return
numer
;
}
public
int
getSaldo
()
{
lock
.
lock
();
try
{
return
saldo
;
}
finally
{
lock
.
unlock
();
}
}
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"
);
}
lock
.
lock
();
saldo
+=
kwota
;
czekanieNaKase
.
signal
();
lock
.
unlock
();
}
public
void
wyplata
(
int
kwota
)
throws
BrakSrodkow
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
}
lock
.
lock
();
try
{
if
(
kwota
>
saldo
)
{
throw
new
BrakSrodkow
(
"Brak środków na koncie nr "
+
numer
);
}
saldo
-=
kwota
;
}
finally
{
lock
.
unlock
();
}
}
public
void
wyplataCzekaj
(
int
kwota
)
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
}
lock
.
lock
();
try
{
while
(
kwota
>
saldo
)
{
czekanieNaKase
.
await
();
}
saldo
-=
kwota
;
czekanieNaKase
.
signal
();
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
finally
{
lock
.
unlock
();
}
}
}
src/main/java/p04_watki/konta/v4_locki/Osoba.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v4_locki
;
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
;
}
}
src/main/java/p04_watki/konta/v4_locki/Podklasa.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v4_locki
;
public
class
Podklasa
extends
Konto
{
public
Podklasa
(
int
numer
,
int
saldo
,
Osoba
wlasciciel
)
{
super
(
numer
,
saldo
,
wlasciciel
);
}
public
void
wplata
(
int
kwota
)
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" we wpłacie"
);
}
saldo
+=
kwota
;
}
}
src/main/java/p04_watki/konta/v4_locki/Przeploty.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v4_locki
;
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
,
1000_000
,
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
);
}
}
src/main/java/p04_watki/konta/v4_locki/WyplacanieBezOczekiwania.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v4_locki
;
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
);
}
}
src/main/java/p04_watki/konta/v4_locki/WyplacanieZOczekiwaniem.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v4_locki
;
import
java.io.IOException
;
class
WyplacanieZOczekiwaniem
{
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
)
{
konto
.
wyplataCzekaj
(
100
);
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
);
}
}
src/main/java/p04_watki/konta/v5_semafor/BrakSrodkow.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v5_semafor
;
public
class
BrakSrodkow
extends
Exception
{
private
static
final
long
serialVersionUID
=
5262944731342409658L
;
public
BrakSrodkow
()
{
super
();
}
public
BrakSrodkow
(
String
message
)
{
super
(
message
);
}
}
src/main/java/p04_watki/konta/v5_semafor/Konto.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v5_semafor
;
import
java.util.concurrent.Semaphore
;
/* Użycie semaforów do takiej synchronizacji jest nietypowe
* - w Javie są mechanizmy prostsze w użyciu.
* Semafory bywają podstawowym mechanizmem synchronizacji na innych platformach,
* ale w Javie nadają się tam, gdzie trzeba "liczyć zasoby" (zob. Afrykarium3).
*/
class
Konto
{
private
final
Semaphore
mutex
=
new
Semaphore
(
1
);
private
final
Semaphore
kasa
=
new
Semaphore
(
0
);
private
int
iluCzekaNaKase
=
0
;
private
final
int
numer
;
protected
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"
);
}
try
{
mutex
.
acquire
();
saldo
+=
kwota
;
if
(
iluCzekaNaKase
>
0
)
{
kasa
.
release
();
}
else
{
mutex
.
release
();
}
}
catch
(
InterruptedException
e
)
{
mutex
.
release
();
}
}
public
void
wyplata
(
int
kwota
)
throws
BrakSrodkow
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
}
try
{
mutex
.
acquire
();
if
(
kwota
>
saldo
)
{
throw
new
BrakSrodkow
(
"Brak środków na koncie nr "
+
numer
);
}
saldo
-=
kwota
;
}
catch
(
InterruptedException
e
)
{
}
finally
{
mutex
.
release
();
}
}
public
void
wyplataCzekaj
(
int
kwota
)
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
}
try
{
mutex
.
acquire
();
while
(
kwota
>
saldo
)
{
iluCzekaNaKase
++;
mutex
.
release
();
kasa
.
acquire
();
iluCzekaNaKase
--;
}
saldo
-=
kwota
;
}
catch
(
InterruptedException
e
)
{
}
finally
{
mutex
.
release
();
}
}
}
src/main/java/p04_watki/konta/v5_semafor/Osoba.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v5_semafor
;
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
;
}
}
src/main/java/p04_watki/konta/v5_semafor/Podklasa.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v5_semafor
;
public
class
Podklasa
extends
Konto
{
public
Podklasa
(
int
numer
,
int
saldo
,
Osoba
wlasciciel
)
{
super
(
numer
,
saldo
,
wlasciciel
);
}
public
void
wplata
(
int
kwota
)
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" we wpłacie"
);
}
saldo
+=
kwota
;
}
}
src/main/java/p04_watki/konta/v5_semafor/Przeploty.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v5_semafor
;
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
,
1000_000
,
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
);
}
}
src/main/java/p04_watki/konta/v5_semafor/WyplacanieBezOczekiwania.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v5_semafor
;
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
);
}
}
src/main/java/p04_watki/konta/v5_semafor/WyplacanieZOczekiwaniem.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v5_semafor
;
import
java.io.IOException
;
class
WyplacanieZOczekiwaniem
{
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
)
{
konto
.
wyplataCzekaj
(
100
);
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
);
}
}
src/main/java/p04_watki/konta/v6_synchronizacja_na_zwyklych_obiektach/BrakSrodkow.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v6_synchronizacja_na_zwyklych_obiektach
;
public
class
BrakSrodkow
extends
Exception
{
private
static
final
long
serialVersionUID
=
5262944731342409658L
;
public
BrakSrodkow
()
{
super
();
}
public
BrakSrodkow
(
String
message
)
{
super
(
message
);
}
}
src/main/java/p04_watki/konta/v6_synchronizacja_na_zwyklych_obiektach/Konto.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v6_synchronizacja_na_zwyklych_obiektach
;
import
java.util.ArrayList
;
import
java.util.List
;
/* W dawniej napisanych programach Javy można spotkać się z techniką,
* że do synchronizacji używa się zwykłych obiektów (klasa nieistotna - może być nawet Object.
* Pozwala to osobno synchronizować wątki, które czekają z różnych powodów.
*
* Obecnie lepszym rozwiązaniem jest użycie Lock-ów.
*/
class
Konto
{
private
final
int
numer
;
private
int
saldo
;
private
Osoba
wlasciciel
;
private
List
<
String
>
wnioski
=
new
ArrayList
<>();
// te obiekty istnieją tylko po to, aby wątki mogły "na nich czekać"
private
Object
ochronaSalda
=
new
Object
();
private
Object
ochronaWnioskow
=
new
Object
();
public
Konto
(
int
numer
,
int
saldo
,
Osoba
wlasciciel
)
{
this
.
numer
=
numer
;
this
.
saldo
=
saldo
;
this
.
wlasciciel
=
wlasciciel
;
}
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"
);
}
synchronized
(
ochronaSalda
)
{
saldo
+=
kwota
;
ochronaSalda
.
notify
();
}
}
public
void
wyplata
(
int
kwota
)
throws
BrakSrodkow
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
}
synchronized
(
ochronaSalda
)
{
if
(
kwota
>
saldo
)
{
throw
new
BrakSrodkow
(
"Brak środków na koncie nr "
+
numer
);
}
saldo
-=
kwota
;
}
}
public
void
wyplataCzekaj
(
int
kwota
)
throws
BrakSrodkow
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
}
try
{
synchronized
(
ochronaSalda
)
{
while
(
kwota
>
saldo
)
{
ochronaSalda
.
wait
();
}
saldo
-=
kwota
;
ochronaSalda
.
notify
();
}
}
catch
(
InterruptedException
e
)
{
// Jeśli ktoś przerwie za pomocą interrupt(), tzn. "nie czekaj już, daj sobie spokój", wtedy rezygnuję z wykonania operacji biznesowej
}
}
public
Osoba
getWlasciciel
()
{
return
wlasciciel
;
}
public
void
setWlasciciel
(
Osoba
wlasciciel
)
{
this
.
wlasciciel
=
wlasciciel
;
}
public
int
getNumer
()
{
return
numer
;
}
public
int
getSaldo
()
{
synchronized
(
ochronaSalda
)
{
return
saldo
;
}
}
public
void
zlozWniosekKredytowy
(
int
suma
)
{
synchronized
(
ochronaWnioskow
)
{
wnioski
.
add
(
"Wniosek o "
+
suma
);
}
}
}
src/main/java/p04_watki/konta/v6_synchronizacja_na_zwyklych_obiektach/Osoba.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v6_synchronizacja_na_zwyklych_obiektach
;
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
;
}
}
src/main/java/p04_watki/konta/v6_synchronizacja_na_zwyklych_obiektach/Przeploty.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v6_synchronizacja_na_zwyklych_obiektach
;
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
,
1000_000
,
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
);
}
}
src/main/java/p04_watki/konta/v6_synchronizacja_na_zwyklych_obiektach/WyplacanieBezOczekiwania.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v6_synchronizacja_na_zwyklych_obiektach
;
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
);
}
}
src/main/java/p04_watki/konta/v6_synchronizacja_na_zwyklych_obiektach/WyplacanieZOczekiwaniem.java
0 → 100644
View file @
bf783d1a
package
p04_watki
.
konta
.
v6_synchronizacja_na_zwyklych_obiektach
;
import
java.io.IOException
;
class
WyplacanieZOczekiwaniem
{
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
.
wyplataCzekaj
(
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
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment