Head First JAVA: 15. Chapter - Kamil-Jankowski/Learning-JAVA GitHub Wiki
Head First JAVA: 15. Chapter
Bank account:
package watki.wspolbieznosc;
class KontoBankowe {
private int stanKonta = 100;
int getStan() {
return stanKonta;
}
void pobierz(int kwota){
stanKonta = stanKonta - kwota;
}
}
package watki.wspolbieznosc;
public class MonikaIRobert implements Runnable{
private KontoBankowe konto = new KontoBankowe();
public static void main(String[] args) {
MonikaIRobert zadanie = new MonikaIRobert();
Thread watekMoniki = new Thread(zadanie);
Thread watekRoberta = new Thread(zadanie);
watekMoniki.setName("Monika");
watekRoberta.setName("Robert");
watekMoniki.start();
watekRoberta.start();
}
@Override
public void run() {
int kwotaWyplaty = 10;
for(int x = 0; x < 10; x++){
pobierzGotowke(kwotaWyplaty);
if (konto.getStan() < 0){
System.out.println("Przekroczenie limitu!");
}
}
}
private synchronized void pobierzGotowke(int kwota) {
if(konto.getStan() >= kwota){
System.out.println(Thread.currentThread().getName() + " ma zamiar wypłacić gotówkę.");
try{
System.out.println("Wątek " + Thread.currentThread().getName() + " zaraz zostanie uśpiony");
Thread.sleep(500);
} catch (InterruptedException e){e.printStackTrace();}
System.out.println("Watek " + Thread.currentThread().getName() + " obudził się");
konto.pobierz(kwota);
System.out.println("Wątek " + Thread.currentThread().getName() + " zakończył operację.");
}else{
System.out.println("Przykro mi, brak środków dla wątku " + Thread.currentThread().getName());
}
}
}
Synchronizing:
package watki.wspolbieznosc;
public class Synchronizacja implements Runnable {
private int stanKonta;
@Override
public void run() {
for (int i = 0; i < 50; i++){
inkrementuj();
System.out.println("Stan konta wynosi: " + stanKonta);
}
}
private synchronized void inkrementuj() {
int i = stanKonta;
stanKonta = i + 1;
}
}
package watki.wspolbieznosc;
public class TestSynchronizacji {
public static void main(String[] args) {
Synchronizacja zadanie = new Synchronizacja();
Thread watekA = new Thread(zadanie);
Thread watekB = new Thread(zadanie);
watekA.start();
watekB.start();
}
}
Multi-threading:
package watki.magnesiki;
public class Sumator {
private int licznik = 0;
private static Sumator s = new Sumator();
private Sumator(){}
public static Sumator getSumator(){
return s;
}
public int getLicznik(){
return licznik;
}
public void aktualizujLicznik(int wart){
licznik += wart;
}
}
package watki.magnesiki;
public class WatekPierwszy implements Runnable{
@Override
public void run() {
try {
Sumator s = Sumator.getSumator();
for(int x = 0; x < 99; x++){
s.aktualizujLicznik(1);
}
System.out.println("Pierwszy - " + s.getLicznik());
Thread.sleep(50);
} catch (InterruptedException ex){}
}
}
package watki.magnesiki;
public class WatekDrugi implements Runnable {
@Override
public void run() {
try {
Sumator s = Sumator.getSumator();
for(int x = 0; x < 98; x++){
s.aktualizujLicznik(1000);
}
Thread.sleep(50);
System.out.println("Drugi - " + s.getLicznik());
} catch (InterruptedException ex){}
}
}
package watki.magnesiki;
public class TestWatkow {
public static void main(String[] args) {
WatekPierwszy w1 = new WatekPierwszy();
WatekDrugi w2 = new WatekDrugi();
Thread pierwszy = new Thread(w1);
Thread drugi = new Thread(w2);
pierwszy.start();
drugi.start();
}
}
Other:
package watki;
public class MojeZadanie implements Runnable {
@Override
public void run() {
doDziela();
}
private void doDziela() {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {ex.printStackTrace();}
kolejnaRobota();
}
private void kolejnaRobota() {
System.out.println("Wierzchołek stosu!");
}
}
package watki;
public class WatkiTester {
public static void main(String[] args) {
Runnable zadanieWatku = new MojeZadanie();
Thread mojWatek = new Thread(zadanieWatku);
mojWatek.start();
System.out.println("Z powrotem w metodzie main()");
}
}