Java - Wątki

0

Witam was,
Jest to pierwszy mój post na waszym forum wic proszę o wyrozumiałość :).

Opis problemu:
Moja alikacja pobiera dane z prostej bazy danych (zakładamy że w bazie mamy 6 rekordów z danymi).
Po pobraniu danych z bazy program powinien uruchomić dalej wątki które wykonają dane zadanie ( w tym przypadku mamy 6 rekordów w bazie więc program powinien uruchomić 6 wątków).

W czym problem ?
Bazując na informacjach jakie posiadam Aby uruchomić "coś - fragment kodu" w wątku deklarujemy np. klasę Wątek, następnie tworzymy obiekt tej klasy i uruchamiamy np. :

class MyThreadR implements Runnable {
. . .
public void run() {
. . .
}
}

Tworzenie i uruchamianie:
MyThreadR r = new MyThreadR();
t.start();

W czym problem? Nie wiem w jaki sposób mogę Tworzyć obiekty danej klasy i jak je uruchamiać skoro nie wiem ile danych (ile rekordów) będzie się znajdowało w mojej bazie danych. W przykładzie mamy tworzenie 1 obiektu danej klasy oraz uruchomienie tego obiektu. A jak działać w przypdku kiedy nie wiemy ile takich obiektów będzie pracowało finalnie?

0

A umiesz wczytywać z pliku czy tam z bazy dane i tworzyć na ich podstawie obiekty jakiejś klasy? Robisz tak samo. Zrób sobie jakąś kolekcję tych obiektów i już.

0

Po pierwsze takie podejście jest niedobre ponieważ tworzysz dużo wątków, które będzie trzeba przełączać i które robią to samo na tych samych danych. Powinieneś utworzyć N wątków gdzie N to liczba procesorów.
Po drugie pobierają dane z bazy możesz zapisać je w kolekcji np. obiekcie List.
Po trzecie czy dane są niezależne? Innymi słowy czy obliczenia dla rekordu X nie mają wpływu na obliczenia dla innych rekordów? Jeżeli nie mają wpływu to można zrobić tak:

  • Utworzyć kolekcję synchronizowaną.
  • Utworzyć N wątków, które będą pobierały z tej kolekcji elementy przez kasowanie (kolekcja jest synchronizowana zatem wszystkie elementy zostaną obsłużone tylko raz)
  • Wykorzystać ThreadPoolExecutor.
0
class MyThreadR implements Runnable {
     . . .
     public void run() {
          . . .
     }
}

//Tworzenie i uruchamianie: 
MyThreadR r = new MyThreadR();
t.start();

Zakladam, ze ostatnia linijka to tylko skrot myslowy.

xiron33 napisał(a)

W czym problem? Nie wiem w jaki sposób mogę Tworzyć obiekty danej klasy i jak je uruchamiać skoro nie wiem ile danych (ile rekordów) będzie się znajdowało w mojej bazie danych. W przykładzie mamy tworzenie 1 obiektu danej klasy oraz uruchomienie tego obiektu. A jak działać w przypdku kiedy nie wiemy ile takich obiektów będzie pracowało finalnie?

Tak, jak napisal poprzednik. Wyciagnij z bazy danych ilosc rekordow i dynamicznie (np. w petli) stworz potrzebne obiekty. Zapoznaj sie rowniez z java.util.concurrent.ThreadPoolExecutor

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