• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Monitory i inne mechanizmy synchronizacji - JAVA

Object Storage Arubacloud
–1 głos
44 wizyt
pytanie zadane 10 maja 2020 w Systemy operacyjne, programy przez j4nsk Nowicjusz (160 p.)

Hej, napisałem kod do pewnego problemu ale muszę go przerobić, bo nie spełnia wymagań. Nie za bardzo wiem jak to zrobić.
Muszę poprawić ten kod w taki sposób, aby zwiększyć liczbę czytelników korzystających jednocześnie z czytelni poprzez umożliwienie wejścia większej liczby oczekujących czytelników.

KOD:

 

//plik CzytPisM.java
import java.util.Random;

//klasa realizująca operacje dostępu/opuszczenia czytelni -> monitor
class Czytelnia {
//aktualna liczba czytelników
  private int czytelnicy;
//czy w czytelni jest pisarz
  private boolean jestPisarz;

  public Czytelnia()
  {
    czytelnicy = 0;
    jestPisarz = false;

    System.out.println("Utworzono czytelnię.");
  }

//wywoływane przed czytaniem
  public synchronized void wejscieCzytelnika() {
    while(jestPisarz) {
      try {
        wait();
      } catch(InterruptedException e) {}
    }
    czytelnicy++;
  }
//wywoływane po zakończeniu czytania
  public synchronized void wyjscieCzytelnika() {
    czytelnicy--;
    if(czytelnicy==0) //czy ten warunek jest potrzebny?
      notify();
  }

//wywoływane przed pisaniem
  public synchronized void wejsciePisarza() {
    while(jestPisarz || czytelnicy>0) {
      try {
        wait();
      } catch(InterruptedException e) {}
    }
    jestPisarz = true;
  }
//wywoływane po zakończeniu pisania
  public synchronized void wyjsciePisarza() {
    jestPisarz = false;
    notify();   //czy nie lepiej notifyAll()?
  }

}

//wątek czytelnika
class Czytelnik extends Thread {
  Czytelnia czyt;
  String id;

  public Czytelnik(Czytelnia c, String nazwa) {
    czyt=c;
    id=nazwa;
  }

  public void run() {
    Random r=new Random();

    while (true) {
      try {
        sleep(500+r.nextInt(500)); //losowe opóźnienie wejścia
      } catch (InterruptedException e) {}

      System.out.println("Czytelnik "+id+" probuje wejść...");
      czyt.wejscieCzytelnika();

      System.out.println("Czytelnik "+id+" czyta.");
      try {
        sleep(500+r.nextInt(500)); //losowe opóźnienie czytania
      } catch (InterruptedException e) {}

      czyt.wyjscieCzytelnika();
      System.out.println("Czytelnik "+id+" wychodzi.");
    }
  }
}

//wątek pisarza
class Pisarz extends Thread {
  Czytelnia czyt;
  String id;

  public Pisarz(Czytelnia c, String nazwa) {
    czyt=c;
    id=nazwa;
  }

  public void run() {
    Random r=new Random();

    while (true) {
      try {
        sleep(500+r.nextInt(500)); //losowe opóźnienie wejścia
      } catch (InterruptedException e) {}

      System.out.println("Pisarz "+id+" probuje wejść...");
      czyt.wejsciePisarza();

      System.out.println("Pisarz "+id+" pisze kolejne wiekopomne dzieło.");
      try {
        sleep(800+r.nextInt(1200)); //losowe opóźnienie pisania
      } catch (InterruptedException e) {}

      czyt.wyjsciePisarza();
      System.out.println("Pisarz "+id+" wychodzi.");
    }
  }
}

//klasa główna
public class CzytPisM {

  public static void main(String[] arg) {
    Czytelnia czyt=new Czytelnia();

    Czytelnik czytelnicy[] = new Czytelnik[] {
      new Czytelnik(czyt,"Franek"), new Czytelnik(czyt,"Kasia"),
      new Czytelnik(czyt,"Mietek"), new Czytelnik(czyt,"Zosia")
    };

    Pisarz p1=new Pisarz(czyt,"Adam Mickiewicz");
    Pisarz p2=new Pisarz(czyt,"Bolesław Prus");

    for(int i=0; i<czytelnicy.length; i++)
      czytelnicy[i].start();
    p1.start();
    p2.start();

//uwaga: w obecnym rozwiązaniu wątki nie kończą działania
    try {
        for(int i=0; i<czytelnicy.length; i++)
            czytelnicy[i].join();
        p1.join();
        p2.join();
    } catch (InterruptedException e) {}
  }
}

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 617 wizyt
pytanie zadane 4 czerwca 2017 w Systemy operacyjne, programy przez PsychoButter Gaduła (3,630 p.)
0 głosów
1 odpowiedź 341 wizyt
pytanie zadane 30 października 2015 w Java przez Ceki Mądrala (5,310 p.)
0 głosów
1 odpowiedź 1,908 wizyt

92,626 zapytań

141,484 odpowiedzi

319,839 komentarzy

62,006 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...