ArrayList obługiwana przez wiele wątków w tym samym czasie (CopyOnWriteArrayList)

0

Witam. Mam następujący problem. Program posiada listę ArrayList, do której w tym samym czasie jeden wątek wrzuca obiekty, zaś kolejny wątek, sprawdza czy pojawił się nowy obiekt, po czym jeśli tak to wykonuje jakieś działania. Program ma tworzyć pewną symulację. Zamiast ArrayList wykorzystałem CopyOnWriteArrayList, lecz drugi wątek w dalszym ciągu nie reaguje na nowe obiekty. Mógłbym prosić o jakąs sugestię dotyczącą tej struktury danych?

0

Jak sprawdzasz, czy się pojawiają nowe elementy. Pokaż k9d.

0

Wydaje mi się, że już rozwiązałem problem. W klasie posiadałem iterator zainicjowany dla wcześniej wspomnianej CopyOnWriteArrayList, w metodzie run miałem pętle while( !iter.hasNext() ). Za każdym przejściem pętli usypiałem na chwilę wątek po czym, ponawiałem przejście pętli. Wystarczyło za każdym razem nadpisać iterator.

public void run() {

        while (AMOUNT > 0){

            System.out.println("run");

            while(!iter.hasNext()){
                System.out.print("waiting...");
                System.out.println(queue.size());
                try {
                    Thread.sleep(Time.TIME_UNIT);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                iter = queue.iterator();    //nadpisanie iteratora
            }
            System.out.println("GOT ONE <---------");
            current = iter.next();
            AMOUNT--;
            System.out.println(current);

1

Wygląda na to, że próbujesz jakimś amatorskim sposobem zrealizować to, co normalnie robi się kolejkami i wzorcem producent-konsument. Fajnie, że masz swoje rozwiązanie, ale jak będziesz chciał zrobić to elegancko, to poczytaj o tych tematach. Wtedy nie potrzebny żaden sleep, wszystko działa na bieżąco.

Twój kod ma jeszcze na sumieniu pewien grzech, zwany "swallowing interrupted exception".

1

Dokłanie, @Qivi to co opisujesz wygląda na typowe użycie tego zacnego interfejsu: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html

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