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

Odpowiedz Nowy wątek
2018-04-07 17:14
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?

Pozostało 580 znaków

2018-04-07 18:30
0

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


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.

Pozostało 580 znaków

2018-04-07 18:42
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);

Pozostało 580 znaków

2018-04-07 21:02
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".


Przeważnie ignoruję niezarejestrowanych użytkowników.

Pozostało 580 znaków

2018-04-08 00:38
1

Dokłanie, @Qivi to co opisujesz wygląda na typowe użycie tego zacnego interfejsu: https://docs.oracle.com/javas[...]concurrent/BlockingQueue.html


Nie pomagam przez PM. Pytania zadaje się na forum.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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