przetwarzanie obrazów

0

Cześć :)
Chcę napisać przetwarzanie obrazów wielowątkowo. Nie ma to być nic wygórowanego. Ot tak, żeby się czegoś nauczyć. Otóż mam listę z obiektami typu ImageBuffered. Teraz planuję, żeby obiekt wątku brał sobie referencję do obrazu ( sam wyciąga z listy i usuwa obiekt) i wykonywał na nim operacje ( metoda run() ). Załóżmy, że te pliki są gdzieś w folderze. Czy muszę jakoś synchronizować zapis do pliku? Może jest takie zagrożenie, że jeden i ten sam wątek zacznął pisać po tym samym miejscu.
Jak teraz zoorganizować żeby działało współbieżnie? Myślałem nad takim czymś:
Dopóki lista nie będzie pusta,

  1. bierz nowy wątek z CachedPool.
  2. odpal go

Tak to sobie wymyśliłem, proszę o poprawienie/wyprowadzenie z błędu. Ogólne uwagi/zagrożenia również mile widziane! :)
W szczególności, jeżeli będzie miliard obrazów to powstanie miliard wątków. Nie mam doświadczenia, więc nie wiem czy to normalna praktyka.

Czy to będzie działać współbieżnie? Czy takie współbieżne działanie będę mógł obserwować w postaci krótszego czasu pracy programu w stosunku do programu jednowątkowego.

0

Myślę, że w takim modelu najwygodniejsze będzie użycie struktury danych, która będzie obsługiwała współbieżność np. CopyOnWriteArrayList czy coś z Guavy. Wtedy nie zdarzy się taka sytuacja, że obraz zostanie wyciągnięty dwa razy czy coś. Obsługa pliku (pobieranie oraz zapisywania) raczej powinny być w zsynchronizowanym bloku, żeby nie stało się kuku i tak, dla bezpieczeństwa.

0

O to chodzi, żeby właśnie napisać coś na w miarę niskim poziomie i poćwiczyć synchronizowanie. Przyjdzie czas i na bardziej zaawansowane frameworki.
Liczę na odpowiedź na swoje pytania.

0

Czy muszę jakoś synchronizować zapis do pliku? Może jest takie zagrożenie, że jeden i ten sam wątek zacznął pisać po tym samym miejscu.

Od tego jest system operacyjny, aby zapewnić, że dwa równolegle zapisywane pliki nie nadpiszą się. Nic tutaj nie musisz synchronizować.

Twoje zadanie najprościej wykonać za pomocą puli wątków utworzonej poprzez Executors.newFixedThreadPool (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html), a następnie wykonanie zadań poprzez ExecutorService.invokeAll (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html)

0

dobrze, ale jeżeli będę miał pulę z określoną ilością wątków to jak to organizować, w sensie przydzielanie zadań do przetworzenia obrazu?

0

Nie musisz tego robić.
Wątki w puli same będą pobierać zadania do wykonania przekazane przez ExecutorService.invokeAll.

0
mielony napisał(a):

O to chodzi, żeby właśnie napisać coś na w miarę niskim poziomie i poćwiczyć synchronizowanie. Przyjdzie czas i na bardziej zaawansowane frameworki.
Liczę na odpowiedź na swoje pytania.

Im prędzej poznasz (dobrze) Java Collections i Guavę - tym lepiej dla Ciebie, serio. To trochę standard.

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