Witam mam do zrobienia zadanie na laboratoria:
http://icis.pcz.pl/~marcell/lab09.pdf
Koda jaki stworzyłem do tego zadania to:
package lab7;
class Katalog {
public int id;
public boolean status; // czy ksiazka zostala napisana
public boolean akcja; // czy ksiazka jest w trakcie czytania
public Katalog(int id) {
this.id = id;
this.status = false;
this.akcja = false;
}
}
interface ICzytelnik {
Katalog zacznijCzytanie(int i, String text);
void zakonczCzytanie(Katalog kat, String text);
}
class Czytelnik extends Thread {
private ICzytelnik czytelnia;
private int count;
public Czytelnik(ICzytelnik czytelnia, int id, int count) {
this.czytelnia = czytelnia;
this.count = count;
}
public void run() {
for(int i = 0; i < count; ++i) {
Katalog kat = czytelnia.zacznijCzytanie(i, "*** ID: " + Thread.currentThread().getName() + " Rozpocznij czytanie ...");
try {
double time = Math.random() * 300.0 + 100;
Thread.sleep((int)time);
} catch (InterruptedException e) {}
czytelnia.zakonczCzytanie(kat, "*** ID: " + Thread.currentThread().getName() + " Czytanie zakonczone!");
}
}
}
interface IPisarz {
Katalog zacznijPisanie(String text);
void zakonczPisanie(Katalog kat, String text);
}
class Pisarz extends Thread {
private IPisarz czytelnia;
private int count;
public Pisarz(IPisarz czytelnia, int id, int count) {
this.czytelnia = czytelnia;
this.count = count;
}
public void run() {
for(int i = 0; i < count; ++i) {
Katalog kat = czytelnia.zacznijPisanie("### ID: " + Thread.currentThread().getName() + " Rozpocznij pisanie ...");
try {
double time = Math.random() * 300.0 + 100;
Thread.sleep((int)time);
} catch (InterruptedException e) {}
czytelnia.zakonczPisanie(kat, "### ID: " + Thread.currentThread().getName() + " Pisanie zakonczone!");
}
}
}
class Czytelnia implements IPisarz, ICzytelnik {
private static int id = 1;
private Katalog katalog[];
public Czytelnia(int n) {
katalog = new Katalog[n];
}
public synchronized Katalog zacznijCzytanie(int i, String text) {
boolean status = true;
while(status) {
if(katalog[i] != null) {
if(katalog[i].status == true && katalog[i].akcja == false) {
System.out.println(text + " ksiazki o ID: " + katalog[i].id);
katalog[i].akcja = true;
try {
wait();
} catch (InterruptedException e) {}
status = false;
}
}
}
notifyAll();
return katalog[i];
}
public synchronized Katalog zacznijPisanie(String text) {
System.out.println(text + " ksiazki o ID: " + this.id);
try {
wait();
} catch (InterruptedException e) {}
Katalog kat = new Katalog(id);
this.id++;
notifyAll();
return kat;
}
public synchronized void zakonczCzytanie(Katalog kat, String text) {
System.out.println(text + " ksiazki o ID: " + kat.id);
kat.akcja = false;
notifyAll();
}
public synchronized void zakonczPisanie(Katalog kat, String text){
System.out.println(text + " ksiazki o ID: " + kat.id);
kat.status = true;
katalog[kat.id-1] = kat;
notifyAll();
}
}
public class Lab7 {
public static void main(String args[]) {
int x = 3; // liczba pisarzy
int y = 2; // liczba czytelnikow
int count = 2; // ilosc powtorzen;
if(y > 0) {
if(x > y) {
Czytelnia czytelnia = new Czytelnia(x*count);
Czytelnik c[] = new Czytelnik[y];
Pisarz p[] = new Pisarz[x];
for (int i = 0; i < y; ++i)
c[i] = new Czytelnik(czytelnia, i+1, count*x);
for (int i = 0; i < x; ++i)
p[i] = new Pisarz(czytelnia, i+1, count);
for (int i = 0; i < x; ++i)
p[i].start();
for (int i = 0; i < y; ++i)
c[i].start();
} else {
System.out.println("Liczba pisarzy musi byc wieksza niz liczba czytelnikow!");
}
} else {
System.out.println("Musisz podac liczbe czytelnikow wieksza niz 0!");
}
}
}
Problem polega na tym ze wyświetla mi jedynie jak pisarz rozpoczyna pisanie książki i to na dodatek raz tylko 2 watki czasami 3 nie wiem w czym tkwi problem ;/ Z góry zaznaczam ze nie chodzi mi o rozwiązanie za mnie laboratoriów, podczas rozwiązywania mojego zadania trafiłem na ślepy zaułek i prosiłbym o pomoc dla mnie aby wybrnąć z niego.