wikipedia i co dalej ?

Dyskusje na temat Javy.
Gala

wikipedia i co dalej ?

Post przez Gala »

Fanie by było jakby były jeszcze jakieś dodatkowe zadania wytłumaczone z każdego videokursu które by mialy na celu lepiej rozumianego aspektu videokursu.

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");
	}
}
Jeszcze postaram sie znaleźć jakieś fajne zadania takie które bedą
dobrym treningiem aby lepiej zrozumieć javę.


EDITED: Proszę używać znaczników CODE
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: wikipedia i co dalej ?

Post przez Morfidon »

Witam,

Aby rozwiązać takie zadanie musi Pan w zależności o wariantów użyć w różny sposób blokad, lub też skorzystać z jednej z klas z http://java.sun.com/j2se/1.5.0/docs/api ... Queue.html

Na pewno Pan oglądał kurs java techniki zaawansowane, bo nie widzę, żeby Pan przynajmniej próbował zastosować gdzieś blokadę.

Pozdrawiam,

Arkadiusz
Post Reply