Kolejka wątków

0

Witam
Od pewnego czasu zastanawia mnie temat kolejki, która będzie przechowywała wątki stworzone przez zdarzenia w programie, ale nie uruchomione. Kolejka działała by jak fifo, czyli po skończeniu wątek jest usuwany z kolejki, a następnie jest uruchamiany kolejny. Czy java dostarcza biblioteki dla takiego problemu? Czy posiada ktoś jakiś tutorial z przykładami?
Dzięki!!

0

Tak, poczytaj o ThreadPool, Executorach, itp.

0

Zamiast budowac takie cos, sprobuj np. klas z pakiety java.util.concurrent - tam jest pelno Executorow i innych 'prymitywow' do obslugi watkow.
Sam pomysl kolejki watkow jest kiepski - jak juz musisz cos kolejkowac sam, to lepiej nie watki (kazdy watek zabiera zasoby systemowe) a raczej Runnable czy jakies inne Callable.

0

po skończeniu wątek jest usuwany z kolejki, a następnie jest uruchamiany kolejny

Jaki to ma sens?

1

Potrzebujesz kolejki zadań, nie kolejki wątków.
Zadania możesz trzymać np. w ArrayBlockingQueue jako obiekty Runnable

0

Dzięki za podpowiedź.
Sens kolejki jest taki że: każdy wątek wysyła i odbiera z portu szeregowego pewne dane i wykonuje zapis w bazie danych. W przypadku kiedy jeden wątek nie zakończył zadania, a drugi został stworzony od zdarzenia np cyklicznego to zostanie umieszczony w takiej kolejce aby nie stworzyć konfliktu na porcie i nie pogubić <ort>hronologii ŁAPKI OBETNĘ TUŻ PRZY DUPIE ZA TAKIE BŁĘDY</ort> odczytu/zapisu z portu. Czy ma to sens... pewnie jakiś ma i zależy od częstości wywołań. Zapewne problem można inaczej rozwiązać.
Pozdr!

1

Executors.newSingleThreadExecutor() > http://docs.oracle.com/javase[...]newSingleThreadExecutor%28%29 kolejkuje wywołania. Względnie można sięgnąć do kodu źródłowego, zobaczyć jak tworzony jest executor i podmienić kolejkę na taką jaka jest potrzebna.

1
marolo2 napisał(a)

Dzięki za podpowiedź.
Sens kolejki jest taki że: każdy wątek wysyła i odbiera z portu szeregowego pewne dane i wykonuje zapis w bazie danych. W przypadku kiedy jeden wątek nie zakończył zadania, a drugi został stworzony od zdarzenia np cyklicznego to zostanie umieszczony w takiej kolejce aby nie stworzyć konfliktu na porcie i nie pogubić hronologii odczytu/zapisu z portu. Czy ma to sens... pewnie jakiś ma i zależy od częstości wywołań. Zapewne problem można inaczej rozwiązać.
Pozdr!

Tak, jak pisałem - w kolejce powinny być zadania, nie wątki.
Wątki odczytujące z portu szeregowego powinny tworzyć zadania i umieszczać je w kolejce ArrayBlockingQueue. Dodatkowo istniałby jeden wątek, którego jedynym zadaniem byłoby pobieranie zadań z tej kolejki i ich procesowanie (np. zapis do bazy).

Najlepiej ten pojedynczy wątek stworzyć jako Executor, poprzez newSingleThreadExecutor (tak, jak sugeruje Koziołek).

0

@__krzysiek85, executory działają tak jak opisujesz. Tworzony jest wątek i kolejka Runnable do której wrzucane są obiekty przekazane przez użyszkodnika. Nie ma potrzeby tworzenia dodatkowego wątku, bo executor już go stworzył.

0

Tak, executory dzialaja jak mowi Koziolek i Krzysiu. Tak, one naprawde tak dzialaja.

Panowie, temat wyczerpany chyba?

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