przekazywanie do tablicy

przekazywanie do tablicy
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
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ć?

WK
WK
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:110
1

A czy w jakikolwiek sposob zsynchronizowales dostep do tej kolejki?

MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
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

edytowany 9x, ostatnio: mielony
OW
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:7
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:

Kopiuj
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:

Kopiuj
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.

edytowany 3x, ostatnio: Ownelek
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
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.

WK
WK
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:110
1

A moglbys zamiescic kod, ktory sie kompiluje?

MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.