Wątki

0

Potrzebuje drobnej pomocy mianowicie próbuje zrobić wielowątkowy program który będzie działał na zasadzie :

  • Połączenie wielu klientów jeden server.
  • Mam pulę wątków pracujących na serverze - Executors.newFixedThreadPool(5).
  • Wątki pracują różną ilość czasu ( przesyłanie plików od klienta na server).
  • Gdy jeden klient wysyła np 10 plików ( 5 aktualnie wysyla ,5 czeka na zasoby) , gdy pojawi się drugi klient jego pliki mają przeplatać się z plikami oczekującymi pierwszego klienta.
  • Wątki powinny pracować maksymalnie 5 sekund po tym czasie powinny wrócić do kolejki i czekać na ponowne dostanie zasobów.

Czy istnieje jakiś sposób żeby coś takie stworzyć?

2

Możesz użyć rxJavy/reactora, wówczas przetwarzanie żądania dodania pojedynczego pliku wyglądałoby mniej więcej tak (w zależności jak chcesz przesyłać te pliki, czy Restem, czy multipart):

@PostMapping("/file")
Single<FileResult> addFile(@RequestBody AddFileRequest f) {
   return Single.fromCallable(() -> fileRepository.save(f.content()))
             .timeout(5, TimeUnit.SECONDS)
             .subscribeOn(fixedSizeScheduler);
}

gdzie fixedSizeScheduler = Schedulers.from(Executors.newFixedThreadPool(5))

0

Pliki przesyłam przez socket. Może troszkę uproszczę, w tej chwili staram się dodawać nowe Wątki na początek ThreadPool zamiast przeplatać je z innymi . Czy jest to możliwe aby nowe wątki szły na początek kolejki?

0

Załączony kod niewiele pomógł (wrzucone pliki .class, niezautomatyzowany build, brak README). Opisz proszę, jaki jest cel tego ćwiczenia, co chcesz osiągnąć. Mam wrażenie, że opisujesz rozwiązanie, a nie realny problem, który rozwiązujesz :)

0

To ma być coś ala DropBox . Problemem w tej chwili jest zarządanie zasobami procesora. Nie chce aby każdy nowy wysyłany plik , tworzył nowy wątek a jedynie korzystał z puli przeznaczonej dla klienta. Przykładowo mam 8 wątków w puli do zarządzania plikami , gdy połączony jest tylko jeden klient dostaje on wszystkie możliwe wątki do pracy nad plikami . Ale w momencie gdy połączy się drugi nie może on czekać aż skończy przesyłać pierwszy klient(zakładam że wszystkie wątki są zajęte, a on powinien dostać 4 z puli). Lista zadań na serwerze powinna ulec reorganizacji (tak aby każdy klient miał wrażenie natychmiastowej usługi).

0

Teraz chyba pomieszałeś, bo gdyby przydzielić 8 wątków Executors.newFixedThreadPool(8) to pojedynczy klient zajmuje 1 wątek z 8 a nie całe 8. Ty chcesz zrobić przełączanie między wątkami, żeby na przemian wykonywał się wątek każdego klienta a nie tylko jednego który zajmuje cały czas i blokuje inne a dopiero jak skończy to wtedy kolejny klient jest obsługiwany i tak dalej. Akurat nie grzebałem się w tym tak dogłębnie i nie wiem jak to rozwiązać, ale może z tym warto pokombinować http://www.java2s.com/Tutorials/Java/Java_Thread/0070__Java_Thread_Life_Cycle.htm

0

Wydaje mi się, że wystarczy wrzucać zadania dodania pliku na kolejkę, z której czytają jednowątkowi konsumenci (round robin) i nimi robisz zapis. Wówczas zadania dodawane przez użytkowników współbieżnie będą "wymieszane" na kolejce, przez co żaden z nich nie zostanie zagłodzony.

0
goose_ napisał(a):

Teraz chyba pomieszałeś, bo gdyby przydzielić 8 wątków Executors.newFixedThreadPool(8) to pojedynczy klient zajmuje 1 wątek z 8 a nie całe 8. Ty chcesz zrobić przełączanie między wątkami, żeby na przemian wykonywał się wątek każdego klienta a nie tylko jednego który zajmuje cały czas i blokuje inne a dopiero jak skończy to wtedy kolejny klient jest obsługiwany i tak dalej. Akurat nie grzebałem się w tym tak dogłębnie i nie wiem jak to rozwiązać, ale może z tym warto pokombinować http://www.java2s.com/Tutorials/Java/Java_Thread/0070__Java_Thread_Life_Cycle.htm

Wydaje mi się że mówisz o synchronizacji, ponieważ oprócz wysyłania plików . Jest jeszcze wątek który synchronizuje foldery klienta i jego pliki na serverze(dla każdego klienta po jednym).

1

Polecam nieblokujące IO zamiast zwykłych socketów - wtedy możesz wszystko obsłużyć nawet jednym wątkiem

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