Vous êtes sur la page 1sur 4

Lucrare de laborator nr.

6
/*Cazacu Alexei
* Scrieţi un program pentru 9 scriitori şi 16 cititori,
* fiecare scriitor scrie cîte 10 cărți.
*/

import java.util.*;
// =======================================================================

class Book
{
boolean bookReading = false;
public String titleBookAuth;
public Book(Writer writer)
{ titleBookAuth = "<< cartea " + writer.booksWritten + " >>" + " scrisa de " + writer.getName(); }

public synchronized void read() { bookReading = true; } //sincronizare citire carte


public void endReading() { bookReading = false; }
public String toString() { return titleBookAuth; }
} // end Book class

class Library
{
private Vector<Book> books;
private boolean busyState = false;

public Library()
{ books = new Vector<Book>(); }

public synchronized void Add(Book book) // sincronizare adaugare carte


{
while(!allowAdding()) { return; }
books.add(book); if(allowReading()) { notifyAll(); }
}

public synchronized Book Extract(Reader cititor)


{//daca biblioteaca e ocupata, cititorii asteapta sa citeasca
while(!allowReading())
{ try { wait(); } catch (InterruptedException e) {} }
busyState = true; // scriitorii nu pot sa scrie

Book book = null;


if(cititor.booksReaded.size() == 0)
{ for (Book aLibrary : books)
{ if (!aLibrary.bookReading) { book = aLibrary; break; } }
}
else { for (Book bookLibrary : books) {
if(!hasBeenRead(bookLibrary, cititor.booksReaded))
{ if (!bookLibrary.bookReading) { book = bookLibrary; break; } } } }
busyState = false;
if(allowAdding()) { notifyAll(); } return book;
}

private boolean hasBeenRead(Book book, Vector<Book> booksReaded)


{
boolean isReaded = false;
for(Book readBook : booksReaded)
{ if(book.titleBookAuth.equals(readBook.titleBookAuth)) { isReaded = true; break; } }
return isReaded;
}

private boolean allowReading() { return books.size() > 0 && !busyState; }


private boolean allowAdding() { return books.size() < 10; }
} // end Library class

class Reader extends Thread


{
static int numberReaders = 0;
private Library bibl;
public Vector<Book> booksReaded;

public Reader(Library bibRef)


{
super("Cititorul " + numberReaders);
bibl = bibRef; numberReaders++;
booksReaded = new Vector<Book>();
}

public void run()


{
do
{ Book book = bibl.Extract(this);// sincronizare extragere carte
if(book == null) // daca nu-i nici o carte, cititoru nu citeste
{
System.out.println(getName() + " inca nu a citit carti!");
try { Thread.sleep(100);} catch (InterruptedException e) { e.printStackTrace();}
}
else
{
book.read();// cititoru citeste
System.out.println(getName() + " citeste " + book);
try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(getName() + " a terminat de citit " + book);
book.endReading(); booksReaded.add(book);
}
}
while(booksReaded.size() < 10); // pina cind nu vor fi citite
}
}

class Writer extends Thread


{
static int numberAuth = 0;
private Library bibl;
public int booksWritten = 0;
public Writer(Library bibRef) { super("Scriitorul " + numberAuth); bibl = bibRef; numberAuth++; }

public void run()


{
do{
try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace();}
Book book = new Book(this);
booksWritten++;
System.out.println(getName() + " a scris " + book);
bibl.Add(book);
} while (booksWritten < 10);
System.out.println(getName() + " total scris: " + booksWritten + " carti.");
}
}

public class ProblemaClasica1 {


public static void main(String[] args) {
Library bibl = new Library();
Writer autor[] = new Writer[9];
Reader citr[] = new Reader[16];

for(int i = 0; i < autor.length; i++)


{ autor[i] = new Writer(bibl); autor[i].start(); }

for(int i = 0; i < citr.length; i++)


{ citr[i] = new Reader(bibl); citr[i].start(); }

for(int i = 0; i < citr.length; i++)


{try { citr[i].join(); } catch (InterruptedException e) { e.printStackTrace();}}
System.out.println("Finalizare program...");
}
}

Rezultat:

Scriitorul 0 a scris << cartea 0 >> scrisa de Scriitorul 0


Scriitorul 1 a scris << cartea 0 >> scrisa de Scriitorul 1
Scriitorul 2 a scris << cartea 0 >> scrisa de Scriitorul 2
Scriitorul 3 a scris << cartea 0 >> scrisa de Scriitorul 3
Scriitorul 4 a scris << cartea 0 >> scrisa de Scriitorul 4
Scriitorul 5 a scris << cartea 0 >> scrisa de Scriitorul 5
Scriitorul 6 a scris << cartea 0 >> scrisa de Scriitorul 6
Scriitorul 7 a scris << cartea 0 >> scrisa de Scriitorul 7
Scriitorul 8 a scris << cartea 0 >> scrisa de Scriitorul 8
Cititorul 15 citeste << cartea 0 >> scrisa de Scriitorul 0
Cititorul 13 citeste << cartea 0 >> scrisa de Scriitorul 2
Cititorul 12 citeste << cartea 0 >> scrisa de Scriitorul 3
Cititorul 11 citeste << cartea 0 >> scrisa de Scriitorul 4
Cititorul 8 citeste << cartea 0 >> scrisa de Scriitorul 7
Cititorul 7 citeste << cartea 0 >> scrisa de Scriitorul 8
Cititorul 14 citeste << cartea 0 >> scrisa de Scriitorul 1
Cititorul 0 inca nu a citit carti!
Cititorul 1 inca nu a citit carti!
Cititorul 9 citeste << cartea 0 >> scrisa de Scriitorul 6
Cititorul 10 citeste << cartea 0 >> scrisa de Scriitorul 5

Scriitorul 2 total scris: 10 carti.


Scriitorul 1 a scris << cartea 9 >> scrisa de Scriitorul 1
Scriitorul 1 total scris: 10 carti.
Scriitorul 0 a scris << cartea 9 >> scrisa de Scriitorul 0
Scriitorul 0 total scris: 10 carti.
Scriitorul 4 total scris: 10 carti.
Scriitorul 3 total scris: 10 carti.
Scriitorul 8 a scris << cartea 9 >> scrisa de Scriitorul 8
Scriitorul 8 total scris: 10 carti.
Scriitorul 7 a scris << cartea 9 >> scrisa de Scriitorul 7
Scriitorul 7 total scris: 10 carti.
Scriitorul 5 a scris << cartea 9 >> scrisa de Scriitorul 5
Scriitorul 5 total scris: 10 carti.
Scriitorul 6 a scris << cartea 9 >> scrisa de Scriitorul 6
Scriitorul 6 total scris: 10 carti.
Cititorul 11 a terminat de citit << cartea 0 >> scrisa de Scriitorul 8
Cititorul 11 inca nu a citit carti!
Cititorul 3 a terminat de citit << cartea 1 >> scrisa de Scriitorul 0
Cititorul 11 citeste << cartea 1 >> scrisa de Scriitorul 0
Cititorul 11 a terminat de citit << cartea 1 >> scrisa de Scriitorul 0
Finalizare program...

Vous aimerez peut-être aussi