Odpalenie wątku

0

Witam.
Mam za zadanie napisanie programu, w którym są dwa wątki odpowiedzialne za dodanie wartości do tej samej tablicy (synchronized), a trzeci wątek ma za zadanie wyrzucać te wartości z tej tablicy.
Jednym z problemów jest to, że ilość tych wprowadzeń musi być większa od wymiarów tablicy, dlatego musi gdzieś sobie w tle działać trzeci wątek, który będzie ją na bieżąco opróżniać. Problem jest taki, że ten mój wątek wyrzucający nie chce odpalać się w tym samym czasie co tamte dwa, a robi to dopiero gdy zakończy się ich działanie, co oczywiście wywala program przez przeładowanie tablicy.
Program pisany oczywiście w javie.

1

Podstawową zasadą pisania wielowątkowo (nie licząc RTOS), mówi że NIGDY nie możesz założyć że coś wykona się w konkretnym przedziale czasowym. Idąc tym tropem, nie możesz założyć że wątek nadąży wyciągać dane, ani nawet czy w ogóle coś pobierze. Przed wsadzeniem musisz sprawdzić czy da się wstawić. Jeżeli nie, to poczekać aż będzie się dało (bez trzymania locka offc). Ulepszając, możesz dodać bufor po stronie wsadzających, czyli.

Pseduokod:

buffor.push(elem);
synchronized{  
    while(queue.isNotFull() && buffor.isNotEmpty(){
       queue.push(buffor.pop());
    }
}
0

Dodałem instrukcję warunkową, sprawdzającą czy coś można wstawić. Wygląda to w ten sposób, że mają do wstawienia 11 elementów w 10 elementową tablicę, program wysypuje się gdy zostaje ostatni element, ale jeszcze zdąży wyrzucić pierwszy który wszedł. Tak wygląda pseudokod:

int element=11;
int tablica[10];
met1(){
    do{
        try{
        sleep(1);
    }
    if(tablica[i]==0){
        tablica[i]=element;
        element--;
        i++;
    }
    while(element != 0);
}

met2(){
    while(true){
        for(i=0;i<element;i++){
            int czas =  rand(5)+1;
            try{
                sleep(czas)
            }
        tablica[i]=0;
        }
    }
}
1

Na początku stwórz obiekt który opakuje twoją strukturę danych. Dopiero wtedy możesz pisać wątki które będą operować na samym obiekcie. Z Twojego pseudokodu nie wynika jak to ma właściwie działać, tym bardziej że np. i w met1 nie istnieje.
Czyli na początku:

  1. Wybierz strukturę danych którą chcesz się bawić. Musi posiadać możliwość wsadzania i pobierania elementu, ale nie dostępu po indeksie. Na początek polecam kolejkę lub stos.
  2. Stwórz obiekt tej struktury. Musi posiadać:
  • konstuktor z parameterem int, który stworzy obiekt o odpowiednim rozmiarze
  • metodę pobierającą
  • metodę wsadzającą (rzuca wyjątek jeżeli pełna)
  • metodę do sprawdzania rozmiaru
  • opcjonalnie, z metody powyzej - czy jest pusta/pełna

To wszystko bez żadnych synchronizacji. Tak jakbyś pisał na jeden wątek. Dopiero później możesz myśleć jak z tego korzystać współbieżnie.

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