Np, jak rozwiązać zadanie wyszukane z wikipedi http://pl.wikipedia.org/wiki/Problem_cz ... _i_pisarzy.
Zrobiłem szkielet
------------------------------------------------------
// Czytelnik.java
Code: Zaznacz cały
public class Czytelnik extends Thread {
private ZasobNiezabezpieczony zasob;
private int ileRazy;
public Czytelnik(ZasobNiezabezpieczony zasob, int ileRazy) {
this.zasob = zasob;
this.ileRazy = ileRazy;
}
@Override
public void run() {
for (int i = 0; i < this.ileRazy; i++) {
zasob.czytaj();
// System.out.println("Czytam zasob: " + );
}
}
}
//pisarz.java
Code: Zaznacz cały
public class Pisarz extends Thread {
private ZasobNiezabezpieczony zasob;
private int ileRazy;
public Pisarz(ZasobNiezabezpieczony zasob, int ileRazy) {
this.zasob = zasob;
this.ileRazy = ileRazy;
}
@Override
public void run() {
for (int i = 0; i < this.ileRazy; i++) {
// System.out.println("Modyfikuje zasob: ");
zasob.powieksz();
}
}
}
//ZasobNiezabezpieczony.java
Code: Zaznacz cały
public class ZasobNiezabezpieczony {
protected int licznik;
public int czytaj() {
return this.licznik;
}
public void powieksz() {
this.licznik++;
}
}
// ZasobZCalkowitymWzajemnymWykluczaniem.java
Code: Zaznacz cały
public class ZasobZCalkowitymWzajemnymWykluczaniem extends
ZasobNiezabezpieczony {
[b]/*
W jaki sposób zainplementować klasę tak by wszyskie operacje czy to zapisu
czy odczytu wykluczały sie wzajemnie czyli w jednym momencie czasu
moze wykonywac sie co najwyzej jedna operacja i jest nia operacja odczytu?
Czy moge zrobić tak że dziedziczą po ZasobNiezabiespieczony
i przesloniajac odziedziczone metody?
*/[/b]
}
Code: Zaznacz cały
public class ZasobZWystarczajacymWzajemnymWykluczaniem extends
ZasobNiezabezpieczony {
[b]// Jak zaimplementowac ta klase tak, by operacja modyfikacji wykluczala
// jakakolwiek inna rownoczesna operacje, natomiast dopuszcza sie by
// rownoczesnie wykonywane byly operacje odczytu. czy to zapisu,
// czy to odczytu wykluczaly sie wzajemnie, czyli: w jednym momencie czasu
// moze wykonywac sie co najwyzej jedna operacja i jest nia operacja odczytu
// lub zapisu.
//Czy moge wykorzystać klasę
// java.util.concurrent.locks.ReadWriteLock.?[/b]
}
/**
* Jak uzupełnic kod dwóch klas
* ZasobZCalkowitymWzajemnymWykluczaniem i
* ZasobZWystarczajacymWzajemnymWykluczaniem ?
*/
Code: Zaznacz cały
public class Start {
public static long test(ZasobNiezabezpieczony zasob, int ileRazy) {
Thread[] threads = new Thread[100];
for (int i = 0; i < 50; i++) {
threads[i] = new Czytelnik(zasob, ileRazy);
}
for (int i = 50; i < 100; i++) {
threads[i] = new Pisarz(zasob, ileRazy);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
threads[i].start();
}
for (int i = 0; i < 100; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
long stop = System.currentTimeMillis();
return stop - start;
}
public static void main(String[] args) {
int ileRazy = 100000;
System.out
.println("Czas wykonania "
+ ileRazy
+ " operacji zapisu/odczytu wykonanych przez 50 czytelnikow i 50 pisarzy na roznych implementacjach zasobu:");
System.out.println("ZasobNiezabezpieczony - "
+ test(new ZasobNiezabezpieczony(), ileRazy) + " ms");
System.out.println("ZasobZCalkowitymWzajemnymWykluczaniem - "
+ test(new ZasobZCalkowitymWzajemnymWykluczaniem(), ileRazy)
+ " ms");
System.out
.println("ZasobZWystarczajacymWzajemnymWykluczaniem - "
+ test(new ZasobZWystarczajacymWzajemnymWykluczaniem(),
ileRazy) + " ms");
}
}
dobrym treningiem aby lepiej zrozumieć javę.
EDITED: Proszę używać znaczników CODE