Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
alx_mszczonow_1
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_mszczonow_1
Commits
ae65b54a
Commit
ae65b54a
authored
Jul 11, 2023
by
Patryk Czarnik
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
synchronizacja kont - pozostałe wersje
parent
79ed24f1
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
1195 additions
and
16 deletions
+1195
-16
Konto.java
src/main/java/p28_watki/b_synchro/v1_metody/Konto.java
+35
-12
Konto_Niepoprawnie.java
...ava/p28_watki/b_synchro/v1_metody/Konto_Niepoprawnie.java
+71
-0
Przeploty.java
src/main/java/p28_watki/b_synchro/v1_metody/Przeploty.java
+1
-1
WyplacanieBezOczekiwania.java
...8_watki/b_synchro/v1_metody/WyplacanieBezOczekiwania.java
+1
-1
WyplacanieZOczekiwaniem.java
...28_watki/b_synchro/v1_metody/WyplacanieZOczekiwaniem.java
+2
-2
BrakSrodkow.java
src/main/java/p28_watki/b_synchro/v2_bloki/BrakSrodkow.java
+13
-0
Konto.java
src/main/java/p28_watki/b_synchro/v2_bloki/Konto.java
+77
-0
Osoba.java
src/main/java/p28_watki/b_synchro/v2_bloki/Osoba.java
+66
-0
Przeploty.java
src/main/java/p28_watki/b_synchro/v2_bloki/Przeploty.java
+48
-0
WyplacanieBezOczekiwania.java
...28_watki/b_synchro/v2_bloki/WyplacanieBezOczekiwania.java
+66
-0
WyplacanieZOczekiwaniem.java
...p28_watki/b_synchro/v2_bloki/WyplacanieZOczekiwaniem.java
+62
-0
BrakSrodkow.java
src/main/java/p28_watki/b_synchro/v3_locki/BrakSrodkow.java
+13
-0
Konto.java
src/main/java/p28_watki/b_synchro/v3_locki/Konto.java
+107
-0
Osoba.java
src/main/java/p28_watki/b_synchro/v3_locki/Osoba.java
+66
-0
Podklasa.java
src/main/java/p28_watki/b_synchro/v3_locki/Podklasa.java
+17
-0
Przeploty.java
src/main/java/p28_watki/b_synchro/v3_locki/Przeploty.java
+48
-0
WyplacanieBezOczekiwania.java
...28_watki/b_synchro/v3_locki/WyplacanieBezOczekiwania.java
+66
-0
WyplacanieZOczekiwaniem.java
...p28_watki/b_synchro/v3_locki/WyplacanieZOczekiwaniem.java
+62
-0
BrakSrodkow.java
...ain/java/p28_watki/b_synchro/v4_semafory/BrakSrodkow.java
+13
-0
Konto.java
src/main/java/p28_watki/b_synchro/v4_semafory/Konto.java
+102
-0
Osoba.java
src/main/java/p28_watki/b_synchro/v4_semafory/Osoba.java
+66
-0
Podklasa.java
src/main/java/p28_watki/b_synchro/v4_semafory/Podklasa.java
+17
-0
Przeploty.java
src/main/java/p28_watki/b_synchro/v4_semafory/Przeploty.java
+48
-0
WyplacanieBezOczekiwania.java
...watki/b_synchro/v4_semafory/WyplacanieBezOczekiwania.java
+66
-0
WyplacanieZOczekiwaniem.java
..._watki/b_synchro/v4_semafory/WyplacanieZOczekiwaniem.java
+62
-0
No files found.
src/main/java/p28_watki/b_synchro/v1_metody/Konto.java
View file @
ae65b54a
...
@@ -3,19 +3,22 @@ package p28_watki.b_synchro.v1_metody;
...
@@ -3,19 +3,22 @@ package p28_watki.b_synchro.v1_metody;
class
Konto
{
class
Konto
{
private
final
int
numer
;
private
final
int
numer
;
private
int
saldo
;
private
int
saldo
;
private
final
Osoba
wlasciciel
;
private
Osoba
wlasciciel
;
public
Konto
(
int
numer
,
int
saldo
,
Osoba
wlasciciel
)
{
public
Konto
(
int
numer
,
int
saldo
,
Osoba
wlasciciel
)
{
this
.
numer
=
numer
;
this
.
numer
=
numer
;
this
.
saldo
=
saldo
;
this
.
saldo
=
saldo
;
this
.
wlasciciel
=
wlasciciel
;
this
.
wlasciciel
=
wlasciciel
;
}
}
public
Osoba
getWlasciciel
()
{
public
synchronized
Osoba
getWlasciciel
()
{
return
wlasciciel
;
return
wlasciciel
;
}
}
public
synchronized
void
setWlasciciel
(
Osoba
wlasciciel
)
{
this
.
wlasciciel
=
wlasciciel
;
}
public
int
getNumer
()
{
public
int
getNumer
()
{
return
numer
;
return
numer
;
}
}
...
@@ -24,10 +27,6 @@ class Konto {
...
@@ -24,10 +27,6 @@ class Konto {
return
saldo
;
return
saldo
;
}
}
public
synchronized
String
toString
()
{
return
"Konto nr "
+
numer
+
", saldo: "
+
saldo
+
", wł.: "
+
wlasciciel
;
}
public
synchronized
void
wplata
(
int
kwota
)
{
public
synchronized
void
wplata
(
int
kwota
)
{
if
(
kwota
<
0
)
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" we wpłacie"
);
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" we wpłacie"
);
...
@@ -35,6 +34,12 @@ class Konto {
...
@@ -35,6 +34,12 @@ class Konto {
saldo
+=
kwota
;
saldo
+=
kwota
;
notify
();
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 "synchorized"
}
}
public
synchronized
void
wyplata
(
int
kwota
)
throws
BrakSrodkow
{
public
synchronized
void
wyplata
(
int
kwota
)
throws
BrakSrodkow
{
...
@@ -42,12 +47,12 @@ class Konto {
...
@@ -42,12 +47,12 @@ class Konto {
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
}
}
if
(
kwota
>
saldo
)
{
if
(
kwota
>
saldo
)
{
throw
new
BrakSrodkow
(
"Brak
środków na koncie nr "
+
numer
);
throw
new
BrakSrodkow
(
"Brak
środków na koncie nr "
+
numer
);
}
}
saldo
-=
kwota
;
saldo
-=
kwota
;
}
}
public
synchronized
void
wyplataCzekaj
(
int
kwota
)
{
public
synchronized
void
wyplataCzekaj
(
int
kwota
)
{
if
(
kwota
<
0
)
{
if
(
kwota
<
0
)
{
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
throw
new
IllegalArgumentException
(
"Ujemna kwota "
+
kwota
+
" w wypłacie"
);
...
@@ -55,13 +60,31 @@ class Konto {
...
@@ -55,13 +60,31 @@ class Konto {
try
{
try
{
while
(
kwota
>
saldo
)
{
while
(
kwota
>
saldo
)
{
wait
();
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
;
saldo
-=
kwota
;
notify
();
notify
();
// "budzenie kaskadowe"
}
catch
(
InterruptedException
e
)
{
}
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/p28_watki/b_synchro/v1_metody/Konto_Niepoprawnie.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v1_metody
;
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/p28_watki/b_synchro/v1_metody/Przeploty.java
View file @
ae65b54a
...
@@ -9,7 +9,7 @@ class Przeploty {
...
@@ -9,7 +9,7 @@ class Przeploty {
final
int
KWOTA
=
10
;
final
int
KWOTA
=
10
;
Osoba
ala
=
new
Osoba
(
"Ala"
,
"Kowalska"
,
LocalDate
.
now
());
Osoba
ala
=
new
Osoba
(
"Ala"
,
"Kowalska"
,
LocalDate
.
now
());
Konto
konto
=
new
Konto
(
1
,
1000000
,
ala
);
Konto
konto
=
new
Konto
(
1
,
1000
_
000
,
ala
);
System
.
out
.
println
(
konto
);
System
.
out
.
println
(
konto
);
...
...
src/main/java/p28_watki/b_synchro/v1_metody/WyplacanieBezOczekiwania.java
View file @
ae65b54a
...
@@ -8,7 +8,7 @@ class WyplacanieBezOczekiwania {
...
@@ -8,7 +8,7 @@ class WyplacanieBezOczekiwania {
public
static
void
main
(
String
[]
args
)
{
public
static
void
main
(
String
[]
args
)
{
final
Osoba
ala
=
new
Osoba
(
"Ala"
,
"Kowalska"
,
"2001-01-01"
);
final
Osoba
ala
=
new
Osoba
(
"Ala"
,
"Kowalska"
,
"2001-01-01"
);
final
Konto
konto
=
new
Konto
(
1
,
1700
,
ala
);
final
Konto
konto
=
new
Konto
(
1
,
1700
,
ala
);
System
.
out
.
println
(
"początek "
+
konto
);
System
.
out
.
println
(
"początek "
+
konto
);
...
...
src/main/java/p28_watki/b_synchro/v1_metody/WyplacanieZOczekiwaniem.java
View file @
ae65b54a
...
@@ -8,7 +8,7 @@ class WyplacanieZOczekiwaniem {
...
@@ -8,7 +8,7 @@ class WyplacanieZOczekiwaniem {
public
static
void
main
(
String
[]
args
)
{
public
static
void
main
(
String
[]
args
)
{
final
Osoba
ala
=
new
Osoba
(
"Ala"
,
"Kowalska"
,
"2001-01-01"
);
final
Osoba
ala
=
new
Osoba
(
"Ala"
,
"Kowalska"
,
"2001-01-01"
);
final
Konto
konto
=
new
Konto
(
1
,
1700
,
ala
);
final
Konto
konto
=
new
Konto
(
1
,
1700
,
ala
);
System
.
out
.
println
(
"początek "
+
konto
);
System
.
out
.
println
(
"początek "
+
konto
);
...
@@ -28,7 +28,7 @@ class WyplacanieZOczekiwaniem {
...
@@ -28,7 +28,7 @@ class WyplacanieZOczekiwaniem {
Thread
wyplacacz
=
new
Thread
(
new
Runnable
()
{
Thread
wyplacacz
=
new
Thread
(
new
Runnable
()
{
public
void
run
()
{
public
void
run
()
{
while
(!
koniec
)
{
while
(!
koniec
)
{
konto
.
wyplataCzekaj
(
100
);
konto
.
wyplataCzekaj
(
100
);
System
.
out
.
println
(
"wypłacacz: wypłaciłem 100, saldo = "
+
konto
.
getSaldo
());
System
.
out
.
println
(
"wypłacacz: wypłaciłem 100, saldo = "
+
konto
.
getSaldo
());
try
{
try
{
Thread
.
sleep
(
200
);
Thread
.
sleep
(
200
);
...
...
src/main/java/p28_watki/b_synchro/v2_bloki/BrakSrodkow.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v2_bloki
;
public
class
BrakSrodkow
extends
Exception
{
private
static
final
long
serialVersionUID
=
5262944731342409658L
;
public
BrakSrodkow
()
{
super
();
}
public
BrakSrodkow
(
String
message
)
{
super
(
message
);
}
}
src/main/java/p28_watki/b_synchro/v2_bloki/Konto.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v2_bloki
;
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/p28_watki/b_synchro/v2_bloki/Osoba.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v2_bloki
;
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/p28_watki/b_synchro/v2_bloki/Przeploty.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v2_bloki
;
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/p28_watki/b_synchro/v2_bloki/WyplacanieBezOczekiwania.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v2_bloki
;
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/p28_watki/b_synchro/v2_bloki/WyplacanieZOczekiwaniem.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v2_bloki
;
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/p28_watki/b_synchro/v3_locki/BrakSrodkow.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v3_locki
;
public
class
BrakSrodkow
extends
Exception
{
private
static
final
long
serialVersionUID
=
5262944731342409658L
;
public
BrakSrodkow
()
{
super
();
}
public
BrakSrodkow
(
String
message
)
{
super
(
message
);
}
}
src/main/java/p28_watki/b_synchro/v3_locki/Konto.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v3_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/p28_watki/b_synchro/v3_locki/Osoba.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v3_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/p28_watki/b_synchro/v3_locki/Podklasa.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v3_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/p28_watki/b_synchro/v3_locki/Przeploty.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v3_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/p28_watki/b_synchro/v3_locki/WyplacanieBezOczekiwania.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v3_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/p28_watki/b_synchro/v3_locki/WyplacanieZOczekiwaniem.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v3_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/p28_watki/b_synchro/v4_semafory/BrakSrodkow.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v4_semafory
;
public
class
BrakSrodkow
extends
Exception
{
private
static
final
long
serialVersionUID
=
5262944731342409658L
;
public
BrakSrodkow
()
{
super
();
}
public
BrakSrodkow
(
String
message
)
{
super
(
message
);
}
}
src/main/java/p28_watki/b_synchro/v4_semafory/Konto.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v4_semafory
;
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/p28_watki/b_synchro/v4_semafory/Osoba.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v4_semafory
;
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/p28_watki/b_synchro/v4_semafory/Podklasa.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v4_semafory
;
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/p28_watki/b_synchro/v4_semafory/Przeploty.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v4_semafory
;
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/p28_watki/b_synchro/v4_semafory/WyplacanieBezOczekiwania.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v4_semafory
;
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/p28_watki/b_synchro/v4_semafory/WyplacanieZOczekiwaniem.java
0 → 100644
View file @
ae65b54a
package
p28_watki
.
b_synchro
.
v4_semafory
;
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
);
}
}
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