wątki synchronizacja

0
class Tablica {
	private String [] tablica = new String[500];
	static int elementTablicy = 0;
	
	public void dodajTablice() {
		for(int i = 0; i < 500; i++) {
			tablica[i] = "zdanie " + i;
		}
	}
	
	synchronized public void wczytajJedenElementTablicy() {
		System.out.println(tablica[elementTablicy]);
		elementTablicy++;
	}
}

class WczytajKolejnyElementTablicy implements Runnable{
	
	private Tablica tablica;
	Thread t;
	
	public WczytajKolejnyElementTablicy(Tablica tablica, String name) {
		this.tablica = tablica;
		t = new Thread(this, name);
		t.start();
	}

	@Override
	public void run() {
		while(true) {
			System.out.print("watek " + t.getName());
			tablica.wczytajJedenElementTablicy();
		}
	}
	
}

public class Main {
	public static void main(String[] args) throws IOException, InterruptedException {
		Tablica tablica = new Tablica();
		tablica.dodajTablice();
		
		for(int i = 0; i <= 5; i++) {
			new WczytajKolejnyElementTablicy(tablica,"" +i);
		}
	
	}
}

program pobiera kolejne elementy tablic
macie może pomysł jak można zrobić ogranicznie to znaczy że jeden wątek nie może pobrać 2 pod rząd tablic czyli watek 1 np gdy sie juz wykonał i pobrał tab[0] przez wczytajJedenElementTablicy() żeby go zablokować i np. dostep do nastepnej tablicy żeby miał tylko wątek 2,3,4,5, i pózniej ponownie?

część wyniku:
watek 1zdanie 4
watek 0zdanie 5
watek 0zdanie 6 //np, tutaj jest blad poniewaz watek 0 drugi raz pod rząd wykonuje sie, a tak nie pownno
watek 3zdanie 7
watek 0zdanie 8
watek 1zdanie 9

1

To czego szukasz to schemat działania kolejki Producent - Konsument
Twój kod powoduje, że każdy z wątków działa asynchronicznie (czyli generalnie jest nieprzewidywalny).
Każdy wątek musi wiedzieć, kiedy ma poczekać, a kiedy działać.

Prosty przykład z książki Herberta Schildta "Kompendium Programisty Wydanie IX".

Klasa Q

package semaphore.book;

import java.util.concurrent.Semaphore;

public class Q {

	int n;
	
	Semaphore semCon = new Semaphore(0);
	Semaphore semProd = new Semaphore(1);
	
	void get() {
		try {
			semCon.acquire();
		} catch (InterruptedException ex) {
			System.out.println("Złapano wyjątek InterruptedException");
		}
		System.out.println(Thread.currentThread().getName() + " - pobrano: " + n);
		semProd.release();
	}
	
	void put(int n) {
		try {
			semProd.acquire();
		} catch (InterruptedException ex) {
			System.out.println("Złapano wyjątek InterruptedException");
		}
		this.n = n;
		System.out.println(Thread.currentThread().getName() + " - włożono: " + n);
		semCon.release();
	}
}

Klasa Consumer

package semaphore.book;

public class Consumer implements Runnable {

	Q q;
	
	public Consumer(Q q, String name) {
		this.q = q;
		new Thread(this, name).start();
	}
	
	@Override
	public void run() {
		for (int i = 1; i <= 20; i++) {
			q.get();
		}
		
	}
}

Klasa Producer

package semaphore.book;

public class Producer implements Runnable {
	
	Q q;
	
	public Producer(Q q) {
		this.q = q;
		new Thread(this, "Producer").start();
	}
	
	@Override
	public void run() {
		for (int i = 1; i <= 40; i++) {
			q.put(i);
		}
		System.out.println("No more!");
	}
}

Klasa przykładowa, wykorzystująca w/w klasy

package semaphore.book;

public class Main {

	public static void main(String[] args) {
		Q q = new Q();
		new Producer(q);
		new Consumer(q, "A");
		new Consumer(q, "B");
	}
}

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