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, botów: 0