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.