Używam CountDownLatch do oczekiwania na określone zdarzenie z innego składnika (działa w innym wątku). Następujące podejście pasowałoby semantykę mojego oprogramowania, ale nie jestem pewien, czy to działa jak oczekuję:Wiele wywołań do CountDownLatch.await (int) z limitem czasu
mCountDownLatch.await(3000, TimeUnit.MILLISECONDS)
otherComponent.aStaticVolatileVariable = true;
mCountDownLatch.await(3500, TimeUnit.MILLISECONDS);
... <proceed with other stuff>
Scenariusz powinien być następujący: Czekam na 3 sekundy, a jeśli jest zatrzask nie licząc do 0, powiadamiam drugi komponent o tej zmiennej, a następnie czekam najwyżej 3,5 sekundy. Jeśli pojawi się czas oczekiwania ponownie, nie obchodzi mnie to i będę kontynuował inne operacje.
Uwaga: Wiem, że tak nie wygląda, ale powyższy scenariusz jest całkowicie uzasadniony i ważny w moim oprogramowaniu.
Przeczytałem dokumentację oczekujących (int, TimeUnit) i CountDownLatch, ale nie jestem ekspertem od Java/Androida, więc potrzebuję potwierdzenia. Dla mnie wszystkie scenariusze wyglądać prawidłowy:
- Jeśli pierwszy Oczekujcie powiedzie się, wówczas drugi czekają powróci natychmiast
- Jeśli pierwsze czasy czekają out, potem drugą Oczekujcie nadal jest ważny; zatem, jeśli druga nitka zauważy sygnału statycznego, drugi Oczekujcie może powrócić powodzeniem
- Obaj czekają na rozmowy time out (to jest w porządku, zgodnie z semantyką moje oprogramowanie jest)
używam Oczekujcie (.. .) poprawnie? Czy drugi może czekać (...) na powyższy sposób, nawet jeśli wcześniej oczekiwano (...) na ten sam obiekt?
Dzięki za bardzo dokładnego kodu. Właściwie moje pytanie było znacznie prostsze, ale jeśli mam rację, faktycznie * udowodniono, że moje założenia są poprawne, więc wielkie dzięki za to! Moje główne pytanie było tylko to: jeśli pierwszy oczekuj() ** razy out ** dla obiektu, czy mogę ponownie wywołać funkcję wait() na tym samym obiekcie (jak w moim kodzie)? Przypuszczam, że tak, ale jak już powiedziałem, nie jestem ekspertem od Javy. (Po otrzymaniu ostatecznego potwierdzenia, na pewno zaznaczę twoją odpowiedź jako odpowiedź, ponieważ jest to więcej niż to, czego potrzebowałem.) –
Heh, cóż, szczerze mówiąc, nie byłem w 100% pewny odpowiedzi z góry moja głowa, a najlepszym sposobem znalezienia takiej odpowiedzi jest wypróbowanie jej. Stąd test :) –