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()");
    }
}