Sortowanie w plikach wątkami

0

Cześć wszystkim,
Robię programik, który tworzy pliki z liczbami, a następnie liczby w tych plikach mają być sortowane przez 4 wątki (każdy wątek ma brać osobny plik). Moje pytanie jest następujące jak stworzyć 4 wątki, które będą pobierały nazwy plików (nazwy plików zwracam jako ArrayList) sortowały a po zakończonym sortowaniu brały następny i tak aż do końca ArrayListy.

0

Poczytaj o wzorcu producer-consumer. Zamiast listy lepiej użyć np. Blockingqueue (arraylist nie jest thread-safe)

1

Cześć,

Musiałbyś jakoś zsynchronizować te wątki. Możesz to zrobić na wiele sposobów:

  • niskopoziomowo z użyciem np. locków, semaforów lub innych mechanizmów dostępnych w Javie.
  • wejść na poziom wyżej i skorzystać Future'ów, które weszły chyba w Javie 8 i użyć takich operatorów, jak thenApply(...), thenCompose(...) itp.
  • skorzystać z biblioteki RxJava. Jest to grubszy temat i musiałbyś najpierw poznać tę bibliotekę. Masz tam wiele operatorów, które pozwalają rozwiązywać takie problemy wysokopoziomowo. W tym przypadku mógłbyś wywołać operację na poszczególnych plikach w 4 instancjach Obervable'ów lub Flowable'ów i następnie scalić wszystkie wyniki z różnych wątków w jeden operatorem zip(...). Możesz użyć też operatora flatMap(...) jeśli chciałbyś aby np. jedna operacja asynchroniczna zależała od drugiej. Aby kod wykonał się na 4 wątkach, możesz stworzyć własny Scheduler, którego użyjesz w subskrypcji na bazie ExecutorService'u, któremu powiesz, że ma użyć 4 wątków.
0

Masz sporo do nadrobienia :P

  1. Pamiętaj żebyś nie robił new Thread tylko zaimplementował Runnable/ Callable i odpalał instacje tych obiektów przez Executor Service:
executorService.submit(new Task(args...))
  1. Nie korzystaj z ArrayList tylko z BlockingQueue. Dobra może tez być ConcurrentMapa (ale nie to tego celu akurat). Polecam ta lekture : https://docs.oracle.com/javase/tutorial/essential/concurrency/collections.html
  2. Polecam korzystać też z CountDownLatch do blokowania wątku głownego zanim wszystkie taski się skończą
    Tutaj masz przykład z implementacją wyszukiwania tekstów w pliku:
    https://github.com/asciborek/concurrency-exercises/blob/master/src/main/java/pl/asciborek/concurrency/words/search/FileWalkerTask.java <- to zadanie odpowiada za wyszukiwanie plików tekstowych w katalogu i wstawienie do kolejki
    https://github.com/asciborek/concurrency-exercises/blob/master/src/main/java/pl/asciborek/concurrency/words/search/FileAnalyzerTask.java <- tu zadanie odpowiada za pobranie pliku z kolejki i wstanienie i znalezienie słowa
0

Użyłem BlockingQueue zamiast ArrayList i coś ruszyło, zadziałało natomiast póki co używam new Thread i th.start() do utworzenia wątków gdyż na razie nie ogarniam tego executorService :D. Dzięki wielkie za wypisanie innych przydatnych rzeczy o których na pewno sobie poczytam.

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