Monitory - kamildworak.comkamildworak.com/files/pw/zadania-zestaw6-pw.pdf · Klasa Kobieta mo»e...

2

Click here to load reader

Transcript of Monitory - kamildworak.comkamildworak.com/files/pw/zadania-zestaw6-pw.pdf · Klasa Kobieta mo»e...

Page 1: Monitory - kamildworak.comkamildworak.com/files/pw/zadania-zestaw6-pw.pdf · Klasa Kobieta mo»e zosta¢ zaimplementowa w nast¦puj¡cy sposób: classKobietaextendsThread {privatefinalLazienka

Programowanie Wspóªbie»ne

Monitory

Zadanie 1

Rozwi¡» problem czytelników i pisarzy za pomoc¡ monitorów w Javie na dwasposoby:

� tylko za pomoc¡ metod wait(), notify() oraz notifyAll(),� z zastosowaniem klasy ReentrantLock oraz warunków (Condition) z pakietu

java.util.concurrent.

Dodaj metod¦ wy±wietlaj¡c¡ na ekranie aktualny stan czytelni (liczb¦ czy-telników oraz liczb¦ pisarzy) uruchamian¡ po ka»dym opuszczeniu/odwiedzeniuczytelni.

Zadanie 2

Napisa¢ program symuluj¡cy korzystanie z koedukacyjnej ªazienki przez kobietyi m¦»czyzn. W ªazience w danym momencie mog¡ znajdowa¢ si¦ tylko kobietylub tylko m¦»czy¹ni. Co wi¦cej, w ªazience w ka»dym momencie mog¡ znajdowa¢si¦ jedynie 3 osoby.

W podstawowej wersji rozwi¡zania dopuszczamy zagªodzenie, tzn. przy dªu-giej kolejce kobiet m¦»czy¹ni mog¡ czeka¢ w niesko«czono±¢, analogiczna sy-tuacja mo»e wyst¡pi¢ dla kobiet. Przedstawi¢ rozwi¡zanie, w którym nie mamo»liwo±ci zagªodzenia.

W rozwi¡zaniu mo»na stosowa¢ semafory.Interfejs klasy Lazienka jest nast¦puj¡cy:

class Lazienka {

public void wchodziKobieta() { }

public void wychodziKobieta() { }

public void wchodziMezczyzna() { }

public void wychodziMezczyzna() { }

}

Page 2: Monitory - kamildworak.comkamildworak.com/files/pw/zadania-zestaw6-pw.pdf · Klasa Kobieta mo»e zosta¢ zaimplementowa w nast¦puj¡cy sposób: classKobietaextendsThread {privatefinalLazienka

Klasa Kobieta mo»e zosta¢ zaimplementowa w nast¦puj¡cy sposób:

class Kobieta extends Thread {

private final Lazienka lazienka_;

private final int proby_;

public Kobieta(Lazienka lazienka, int proby) {

lazienka_ = lazienka;

proby_ = proby;

}

@Override

public void run() {

for (int i = 0; i < proby_; ++i) {

try {

lazienka_.wchodziKobieta();

System.out.println("Kobieta wchodzi");

Thread.yield();

System.out.println("Kobieta wychodzi");

lazienka_.wychodziKobieta();

} catch (InterruptedException ex) {

}

}

}

}

Przykªadowy kod metody main():

public static void main(String[] args) throws InterruptedException {

Lazienka lazienka = new Lazienka();

final int ileKobiet = 5;

final int iluMezczyzn = 5;

final int proby = 100;

Thread [] watki = new Thread[ileKobiet + iluMezczyzn];

for (int i = 0; i < ileKobiet; ++i) {

watki[i] = new Kobieta(lazienka, proby);

}

for (int i = ileKobiet; i < ileKobiet + iluMezczyzn; ++i) {

watki[i] = new Mezczyzna(lazienka, proby);

}

for (Thread t : watki) { t.start(); }

for (Thread t : watki) { t.join(); }

}