Commit 1d943236 by Patryk Czarnik

Projekt obiekty i wątki - przykłady z zajęć

parent 7ce611f9
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>PC21-ObiektyIWatki</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
package hello;
import java.time.LocalDateTime;
public class Proby {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
}
}
package hello;
import javax.swing.JOptionPane;
public class Rozmowa {
public static void main(String[] args) {
String imie = JOptionPane.showInputDialog("Jak masz na imię?");
JOptionPane.showMessageDialog(null, "Witaj " + imie + "!");
// Ctrl+F11
}
}
package obiekty;
public class BrakSrodkow extends Exception {
private static final long serialVersionUID = 1L;
public BrakSrodkow() {
super();
}
public BrakSrodkow(String message) {
super(message);
}
}
package obiekty;
public class Konto {
private final int numer;
private int saldo;
private Osoba wlasciciel;
public Konto(int numer, int saldo, Osoba wlasciciel) {
if(saldo < 0) {
throw new IllegalArgumentException("Ujemna kwota w konstruktorze");
}
this.numer = numer;
this.saldo = saldo;
this.wlasciciel = wlasciciel;
}
// Tylko dla pole wlasciciel pozwalamy na zmianę wartości.
// Nie tworzymy setterów dla pól:
// - numer - ponieważ numer nie będzie się zmieniać (w konkretnym obiekcie)
// dodatkowym podkreśleniem tego faktu i zabezpieczeniem przed własnymi błędami
// jest dopisanie final do pola numer
// - saldo - ponieważ zmiana salda ma być możliwa tylko za pośrednictwem "metod biznesowych" wpłata, wypłata, przelew
public Osoba getWlasciciel() {
return wlasciciel;
}
public void setWlasciciel(Osoba wlasciciel) {
this.wlasciciel = wlasciciel;
}
public int getNumer() {
return numer;
}
public int getSaldo() {
return saldo;
}
public void wplata(int kwota) {
if(kwota <= 0) {
throw new IllegalArgumentException("Ujemna kwota w wplata");
}
saldo += kwota;
}
public void wyplata(int kwota) throws BrakSrodkow {
if(kwota <= 0) {
throw new IllegalArgumentException("Ujemna kwota w wyplata");
}
if(kwota > saldo) {
throw new BrakSrodkow("Brak środków");
}
// Jeśli nie było powodu, aby przerwać, to wykonujemy zleconą operację.
saldo -= kwota;
}
public void przelew(Konto cel, int kwota) throws BrakSrodkow {
if(kwota <= 0) {
throw new IllegalArgumentException("Ujemna kwota w przelew");
}
if(kwota > this.saldo) {
throw new BrakSrodkow("Brak środków do przelewu");
}
this.saldo -= kwota;
cel.saldo += kwota;
}
@Override
public String toString() {
return "Konto nr " + numer + ", saldo " + saldo + ", wł. " + wlasciciel;
}
}
package obiekty;
public class Osoba {
private String imie;
private String nazwisko;
public Osoba(String imie, String nazwisko) {
this.imie = imie;
this.nazwisko = nazwisko;
}
public String getImie() {
return imie;
}
public void setImie(String imie) {
this.imie = imie;
}
public String getNazwisko() {
return nazwisko;
}
public void setNazwisko(String nazwisko) {
this.nazwisko = nazwisko;
}
@Override
public String toString() {
return imie + " " + nazwisko;
}
}
package obiekty;
public class Referencje1 {
public static void main(String[] args) {
Osoba ala = new Osoba("Ala", "Kowalska");
Osoba ola = new Osoba("Ola", "Malinowska");
Konto a = new Konto(1, 1000, ala);
Konto b = new Konto(2, 2000, ola);
System.out.println("a: " + a);
System.out.println("b: " + b);
Konto c = b;
System.out.println("c: " + c);
System.out.println();
// zmiana salda wewnątrz obiektu Konto 2
b.wplata(48);
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("c: " + c);
System.out.println();
// zmiana zmiennej b tak, że od tej pory wskazuje na Konto 1; c się nie zmienia
b = a;
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("c: " + c);
System.out.println();
// tracimy dowiązanie do Konta nr 2 - może zostać usunięte z pamięci
c = b;
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("c: " + c);
System.out.println();
// do zmiennej obiektowej można wpisać wartość null , która oznacza, że zmienna nie wskazuje na żaden obiekt
a = null;
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("c: " + c);
System.out.println();
c = b = a;
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("c: " + c);
}
}
package obiekty;
public class Referencje2 {
static void metoda(Konto a, Konto b, int x) {
System.out.println("Początek metody:");
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("x: " + x);
System.out.println();
a = b;
b.wplata(48);
x += 55;
System.out.println("Koniec metody:");
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("x: " + x);
System.out.println();
}
public static void main(String[] args) {
Osoba ala = new Osoba("Ala", "Kowalska");
Osoba ola = new Osoba("Ola", "Malinowska");
Konto a = new Konto(1, 1000, ala);
Konto b = new Konto(2, 2000, ola);
int x = 5000;
System.out.println("Początek main:");
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("x: " + x);
System.out.println();
metoda(a, b, x);
System.out.println("Koniec main:");
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("x: " + x);
}
}
package obiekty;
public class Referencje3 {
static void metoda(Konto a, Konto b, Konto c, int x) {
System.out.println("Początek metody:");
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("c: " + c);
System.out.println("x: " + x);
System.out.println();
x += 55;
b.wplata(48);
a = new Konto(a.getNumer(), a.getSaldo(), a.getWlasciciel());
a.wplata(33);
a.getWlasciciel().setImie("Alicja");
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("c: " + c);
System.out.println("x: " + x);
System.out.println();
}
public static void main(String[] args) {
Osoba ala = new Osoba("Ala", "Kowalska");
Osoba ola = new Osoba("Ola", "Malinowska");
Konto a = new Konto(1, 1000, ala);
Konto b = new Konto(2, 2000, ola);
Konto c = b;
int x = 5000;
System.out.println("Początek main:");
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("c: " + c);
System.out.println("x: " + x);
System.out.println();
metoda(a, b, c, x);
System.out.println("Koniec main:");
System.out.println("a: " + a);
System.out.println("b: " + b);
System.out.println("c: " + c);
System.out.println("x: " + x);
}
}
package watki.podstawy;
public class BrakSrodkow extends Exception {
private static final long serialVersionUID = 1L;
public BrakSrodkow() {
super();
}
public BrakSrodkow(String message) {
super(message);
}
}
package watki.podstawy;
public class Konto {
private final int numer;
private int saldo;
private Osoba wlasciciel;
public Konto(int numer, int saldo, Osoba wlasciciel) {
if(saldo < 0) {
throw new IllegalArgumentException("Ujemna kwota w konstruktorze");
}
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 synchronized int getSaldo() {
return saldo;
}
public synchronized void wplata(int kwota) {
if(kwota <= 0) {
throw new IllegalArgumentException("Ujemna kwota w wplata");
}
saldo += kwota;
notify();
}
public synchronized void wyplata(int kwota) throws BrakSrodkow {
if(kwota <= 0) {
throw new IllegalArgumentException("Ujemna kwota w wyplata");
}
if(kwota > saldo) {
throw new BrakSrodkow("Brak środków");
}
saldo -= kwota;
}
// Ta wersja w przypadku braku pieniędzy będzie oczekiwać, a nie będzie wyrzucać wyjątku.
public synchronized void wyplataCzekaj(int kwota) throws BrakSrodkow {
if(kwota <= 0) {
throw new IllegalArgumentException("Ujemna kwota w wyplata");
}
try {
while(kwota > saldo) {
wait();
}
saldo -= kwota;
notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void przelew(Konto kontoDocelowe, int kwota) throws BrakSrodkow {
if(kwota <= 0) {
throw new IllegalArgumentException("Ujemna kwota w przelew");
}
synchronized(this) {
if(kwota > this.saldo) {
throw new BrakSrodkow("Brak środków do przelewu");
}
this.saldo -= kwota;
}
synchronized(kontoDocelowe) {
kontoDocelowe.saldo += kwota;
kontoDocelowe.notify();
}
}
@Override
public String toString() {
return "Konto nr " + numer + ", saldo " + saldo + ", wł. " + wlasciciel;
}
}
package watki.podstawy;
public class Osoba {
private String imie;
private String nazwisko;
public Osoba(String imie, String nazwisko) {
this.imie = imie;
this.nazwisko = nazwisko;
}
public String getImie() {
return imie;
}
public void setImie(String imie) {
this.imie = imie;
}
public String getNazwisko() {
return nazwisko;
}
public void setNazwisko(String nazwisko) {
this.nazwisko = nazwisko;
}
@Override
public String toString() {
return imie + " " + nazwisko;
}
}
package watki.podstawy;
public class PierwszeWatki {
public static void main(String[] args) {
System.out.println("Początek main");
System.out.println("Tworzenie wątków...");
// Runnable to jest "przepis" mówiący co ma robić robić wątek; treść wątku.
Runnable przepisA = new Runnable() {
public void run() {
System.out.println("Początek AAA");
for(int i = 1; i <= 100; i++) {
System.out.println("AAA " + i);
}
System.out.println("Koniec AAA");
}
};
// Obiekt Thread to jest wątek, czyli coś, co można uruchomić w ramach aplikacji i co działa "w tle", równolegle z innymi wątkami.
// Najczęściej wątek tworzy się w oparciu o obiekt Runnable, który mówi "co ma robić wątek".
Thread watekA = new Thread(przepisA);
// Można klasy anonimowej użyć bez. w new Thread:
Thread watekB = new Thread(new Runnable() {
public void run() {
System.out.println("Początek BBB");
for(int i = 1; i <= 100; i++) {
System.out.println("BBB " + i);
}
System.out.println("Koniec BBB");
}
});
// Od Java 8 obiekty Runnable (czyli treść wątku) można podawać też jako wyrażenie lambda
Thread watekC = new Thread(() -> {
System.out.println("Początek CCC");
for(int i = 1; i <= 100; i++) {
System.out.println("CCC " + i);
}
System.out.println("Koniec CCC");
});
System.out.println("Wątki utworzone:");
System.out.println(watekA);
System.out.println(watekB);
System.out.println(watekC);
System.out.println("Uruchamiam wątki:");
// wątki uruchamia się metodą start (UWAGA!!!!!! nie metodą run !!!!!)
watekA.start();
watekB.start();
watekC.start();
System.out.println("Wątki uruchomione");
System.out.println("Koniec main");
}
}
package watki.podstawy;
import java.util.Random;
public class SumaTablicy0 {
public static void main(String[] args) {
final int N = 200_000_000;
final int MAX = 1000;
System.out.println("Tworzę tablicę i losuję liczby");
Random random = new Random();
int[] t = new int[N];
for(int i = 0; i < t.length; i++) {
t[i] = random.nextInt(MAX);
}
System.out.println("Liczę sumę");
long p = System.nanoTime();
long suma = 0;
for(int i = 0; i < t.length; i++) {
suma += t[i];
}
long k = System.nanoTime();
System.out.printf("suma: %d, czas: %.3f s\n", suma, (k - p)/1e9);
}
}
package watki.podstawy;
import java.util.Random;
public class SumaTablicy1 {
static long suma1, suma2;
public static void main(String[] args) {
final int N = 200_000_000;
final int MAX = 1000;
System.out.println("Tworzę tablicę i losuję liczby");
Random random = new Random();
int[] t = new int[N];
for(int i = 0; i < t.length; i++) {
t[i] = random.nextInt(MAX);
}
System.out.println("Przygotowuję wątki");
// Wątek1 liczy sumę elementów od 0 do < N/2 i zapisuje wynik w zmiennej suma1
// Wątek2 liczy sumę elementów od N/2 do < length i zapisuje wynik w zmiennej suma2
Thread watek1 = new Thread(() -> {
long sumaLokalna = 0;
for(int i = 0; i < N/2; i++) {
sumaLokalna += t[i];
}
suma1 = sumaLokalna;
});
Thread watek2 = new Thread(() -> {
long sumaLokalna = 0;
for(int i = N/2; i < N; i++) {
sumaLokalna += t[i];
}
suma2 = sumaLokalna;
});
System.out.println("Liczę sumę");
long p = System.nanoTime();
watek1.start();
watek2.start();
try {
watek1.join();
watek2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
long sumaLaczna = suma1 + suma2;
long k = System.nanoTime();
System.out.printf("suma: %d, czas: %.3f s\n", sumaLaczna, (k-p)/1e9);
}
}
package watki.podstawy;
public class Synchronizacja1 {
public static void main(String[] args) {
Konto konto = new Konto(1, 1_000_000, new Osoba("Ala", "Kowalska"));
System.out.println("Początkowy stan konta: " + konto.getSaldo());
Thread wplacacz = new Thread(() -> {
for(int i = 1; i <= 100_000; i++) {
konto.wplata(10);
}
});
Thread wyplacacz = new Thread(() -> {
for(int i = 1; i <= 100_000; i++) {
try {
konto.wyplata(10);
} catch (BrakSrodkow e) {
System.err.println(e);
}
}
});
System.out.println("Uruchamiam wątki");
wplacacz.start();
wyplacacz.start();
// Aby poczekać, aż wątki się zakończą, używa się metody join.
// Tutaj main czeka aż zakończą się wątki wplacacz i wyplacacz.
try {
wplacacz.join();
wyplacacz.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Końcowy stan konta: " + konto.getSaldo());
}
}
package watki.podstawy;
public class Synchronizacja2 {
public static void main(String[] args) {
Konto konto = new Konto(1, 2300, new Osoba("Ala", "Kowalska"));
System.out.println("Początkowy stan konta: " + konto.getSaldo());
Thread wplacacz = new Thread(() -> {
while(true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
konto.wplata(1000);
System.out.println("wpłacacz: wpłaciłem, saldo = " + konto.getSaldo());
}
});
Thread wyplacacz = new Thread(() -> {
while(true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
try {
konto.wyplataCzekaj(300);
System.out.println("wypłacacz: wypłaciłem, saldo = " + konto.getSaldo());
} catch (BrakSrodkow e) {
System.err.println("BRAKUJE KASY");
}
}
});
System.out.println("Uruchamiam wątki");
wplacacz.start();
wyplacacz.start();
}
}
package watki.podstawy;
public class Synchronizacja2_BrakKasy {
public static void main(String[] args) {
Konto konto = new Konto(1, 2300, new Osoba("Ala", "Kowalska"));
System.out.println("Początkowy stan konta: " + konto.getSaldo());
Thread wplacacz = new Thread(() -> {
while(true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
konto.wplata(1000);
System.out.println("wpłacacz: wpłaciłem, saldo = " + konto.getSaldo());
}
});
Thread wyplacacz = new Thread(() -> {
while(true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
try {
konto.wyplata(300);
System.out.println("wypłacacz: wypłaciłem, saldo = " + konto.getSaldo());
} catch (BrakSrodkow e) {
System.err.println("BRAKUJE KASY");
}
}
});
System.out.println("Uruchamiam wątki");
wplacacz.start();
wyplacacz.start();
}
}
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