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!!
- Rejestracja:ponad 13 lat
- Ostatnio:prawie 9 lat
- Postów:7
- Rejestracja:około 16 lat
- Ostatnio:12 miesięcy
- Postów:1398
Tak, poczytaj o ThreadPool, Executorach, itp.
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.

- Rejestracja:ponad 18 lat
- Ostatnio:około 9 lat
- Postów:1019
Potrzebujesz kolejki zadań, nie kolejki wątków.
Zadania możesz trzymać np. w ArrayBlockingQueue jako obiekty Runnable
- Rejestracja:ponad 13 lat
- Ostatnio:prawie 9 lat
- Postów:7
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!
Executors.newSingleThreadExecutor() > http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executors.html#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.

- Rejestracja:ponad 18 lat
- Ostatnio:około 9 lat
- Postów:1019
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).
@__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ł.