przekazywanie do tablicy

0

Czećś :)
Mam kolejkę zadeklarowaną i zainicjalizowaną w mainie. Potem wywołuję execute, który wykonuje metodę run innego obiektu. W ramach tej metody dodajędo tej kolejki elemnty. Jeżeli po zakończeniu wykonywania tego wątku (executor.shutdown) chcę wypisać pierwszy elemnent to dostaję wyjątek, że nie ma elementu :(
Jeżeli wypisują go w metodzie run tego wątku, to jest OK.
Co robić?

1

A czy w jakikolwiek sposob zsynchronizowales dostep do tej kolejki?

0

tak, wszystkie metody dodawania do kolejki, usuwania, pobierania, isempty(),wyświetlania są synchronized ( własnie ta funkcja mi nic nie zwraca w main, a w wątku ( metodzie run) daje poprawne wyniki na ekran).
Dokładniej fragment klasy reprezentującej listę wygląda tak:
Zamieszczam kody:
Klasa pobierająca obrazki: http://pastebin.com/ehjTRwgi
Klasa listy synchronizujaca wstawianie obrazkow: http://pastebin.com/ACHGbYTM
Klasa "Główna": http://pastebin.com/BSb56ztM

Problem opisuje w komentarzu w kodzie.
Zatem najpierw otwórz kod "Główna" a on dalej Cię pokieruje.
Pozdrawiam! :D

0

Jesteś pewien że lista w wątku głównym i lista w dodatkowym wątku to ta sama lista? Jak na moje brakuje final przy liście w głównej klasie:

final WspolnaLista listToRendering = new WspolnaLista();

@Edit.
Poza tym w dziwny sposób tworzysz nowy wątek. Klasa PobieraczObrazkow powinien byc pochodny od Thread ( klasa Thread ma w sobie interfejs Runnable ).
I wtedy robisz w klasie głównej:

PobieraczObrazkow pobieraczObrazkow = new PobieraczObrazkow(listToRendering, pathname);
pobieraczObrazkow.run();

I wtedy nie musisz wymuszać zakończenie wątku tak jak ty to robisz. Ni w ząb nie mogę zrozumieć czemu używasz shutdown. Samo execute powinno wystarczyć, problem pojawia się wtedy kiedy główny wątek chce odczytać liste, a drugi wątek w tym samym czasie pakuje do niej dane.

0

Jesteś pewien że lista w wątku głównym i lista w dodatkowym wątku to ta sama lista? Jak na moje brakuje final przy liście w głównej klasie:

final WspolnaLista listToRendering = new WspolnaLista();

Nic nie pomogło, bo niby dlaczego miałoby pomóc. W ten sposób mogłem się zabezpieczyć, żeby przypadkowo nie zmienić referencji. Jak widać, nie zmieniam.

@Edit.
Poza tym w dziwny sposób tworzysz nowy wątek. Klasa PobieraczObrazkow powinien byc pochodny od Thread ( klasa Thread ma w sobie interfejs Runnable ).
I wtedy robisz w klasie głównej:

PobieraczObrazkow pobieraczObrazkow = new PobieraczObrazkow(listToRendering, pathname);
pobieraczObrazkow.run();

I wtedy nie musisz wymuszać zakończenie wątku tak jak ty to robisz. Ni w ząb nie mogę zrozumieć czemu używasz shutdown. Samo execute powinno wystarczyć, problem pojawia się wtedy kiedy główny wątek chce odczytać liste, a drugi wątek w tym samym czasie pakuje do niej dane.

A co złego w implementowaniu Runnable jest? Używam przecież to tego i tak Executorów.

1

A moglbys zamiescic kod, ktory sie kompiluje?

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