wątki - synchronizacja

0
public class Project {
	static int[] lib1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	static int[] lib2 = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
	static int[] lib3 = { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };

	int book = 0;
	boolean newBook = false;

	// ustalanie ksiazki do wypozyczenia wywoluje czytelnik
	synchronized void setBookToBorrow(int n) {
		while (newBook == true) {
			try {
				wait();
			} catch (InterruptedException exc) {
			}
		}
		book = n;
		newBook = true;
		notifyAll();
	}

	// Metoda szukania ksiazki wywoluje bibliotekarz
	synchronized int LookForBook(int[] tab) {
		boolean check = false;
		while (newBook == false) {
			try {
				wait();
			} catch (InterruptedException exc) {
			}
		}
		for (int i = 0; i < tab.length; i++) {
			if (book == tab[i]) {
				check = true;	
			}
		}
			if(check == true){
				System.out.println("Z biblioteki wypozyczono ksiazke: " + book);
			} else {
				System.out.println("W bibliotece nie ma ksiazki " + book);
			}
			newBook = false;
			notifyAll();
		return book;
	}

}


// Klasa bibliotekarza
class Librarian extends Thread {

	Project first;

	Librarian(Project f) {
		first = f;
	}

	public void run() {
		try {
			sleep((int) Math.random() * 1000);
		} catch (InterruptedException e) {
		}
		first.LookForBook(Project.lib1);
	}

	
}


 // Klasa czytelnika
	    class BookReader extends Thread {

	    Project first;
	    Integer[] list1 = {2,6,11};
	    BookReader(Project f) {
		      first=f;
		    }

	      public void run() {
	    	  for (int i = 0; i < list1.length; i++) {
				first.setBookToBorrow(list1[i]);
			}
	       
	        }
	      }

pytanie brzmi: dlaczego watek po pierwszym poprawnym wywolaniu metody lookforbook przy kolejnym elemencie tablicy czeka. Utknalem, prosze o pomoc.

0

metoda run wykonuje się tylko raz, więc klasa Librarian powinna wyglądać tak:

class Librarian extends Thread {

	Project first;

	Librarian(Project f) {
		first = f;
	}

	public void run() {
		while (true) {
			try {
				sleep((int) Math.random() * 1000);
			} catch (InterruptedException e) {
			}
			first.LookForBook(Project.lib1);
		}
	}

}

PS Następnym razem opisz w dwóch słowach co robi Twój kod, wtedy nie będzie trzeba dedukować ;)

miłego dnia

0

Masz racje, wybacz. Dziekuje za pomoc :)

// Klasa bibliotekarza
class Librarian extends Thread {

	Project first;
	int[] tab;

	Librarian(Project first, int[] tab) {
		this.first = first;
		this.tab = tab; 
	}

	public void run() {
		while(true){
		try {
			sleep((int) Math.random() * 1000);
		} catch (InterruptedException e) {
		}
		first.LookForBook(tab);
	}
	}
	
}

//tworzenie bibliotekarzy
(...)
Thread l1 = new Librarian(p, Project.lib1);
Thread l2 = new Librarian(p, Project.lib2);
hread l3 = new Librarian(p, Project.lib3);

tworzac np 2 czytelnikow z roznymi listami do wypozyczenia, jak wymusic by przechodzili od jednego librarian do drugiego?

1 użytkowników online, w tym zalogowanych: 0, gości: 1