2011-09-14 16 views
7

Czy Priorytet wątku zwiększa dokładność Thread.sleep(50);?Priorytet wątku i Dokładność gwintu

Jak wiemy Wątki nie są dokładne, gdy wywołujesz sen przez 50 ms, ale czy zwiększa dokładność w dowolny sposób? Jeśli wątek jest wymieniony jako MAX_PRIORITY.

Będę wdzięczny za wszelkie wyjaśnienia.

Odpowiedz

5

Dokładność snu sprowadza się do systemu operacyjnego. Jeśli chcesz większej dokładności, możesz użyć innego systemu operacyjnego. Inne podejście polega na tym, że nie śpij, zamiast tego możesz zająć dużo czasu. Lub możesz spać na przykład 45 ms i zajętego czekać przez 5 ms.

Jeśli masz zadanie, które musisz uruchomić 20 razy na sekundę, lepiej jest śledzić, kiedy zadania powinny być wykonywane dalej i uruchomić je w tym czasie (zamiast czekać przez określony czas), co robisz między snami również zajmie trochę czasu.

BTW To właśnie robi dla Ciebie ScheduledExecutorService.scheduleAtFixedRate.

Może spać pomiędzy zadaniami z dokładnością do mikrosekundy (zakładając, że system operacyjny obsługuje to), ale stara się nie dryfować.

0

Nie mogę sobie wyobrazić, żeby tak było. Ale efekty priorytetów wątków zależą od systemu operacyjnego hosta.

0

Nie jest to bezpośrednio związane z dokładnością gwintu, ale tak, jak nadałeś priorytet MAX po snu 50 milisekund JVM wybierze jeden z wątków do przetworzenia z tym samym priorytetem MAX.

0

Tak, może zrobić to dokładniejsze.

Niemniej od Java Concurrency In Practice, Brian Goetz:

Mechanizm priorytet wątku jest tępym narzędziem, a to nie zawsze jest oczywiste, jaki wpływ będą miały zmieniające się priorytety; zwiększenie priorytetu wątku może nic nie zrobić lub zawsze może spowodować zaplanowanie jednego wątku zamiast drugiego, powodując głód.

Zazwyczaj mądrze jest przeciwstawić się pokusie dostosowywania priorytetów wątków. Zaraz po rozpoczęciu modyfikacji priorytetów zachowanie aplikacji staje się specyficzne dla platformy i wprowadzasz ryzyko głodu. Często zdarza się, że program, który próbuje odzyskać dane po zmianie priorytetu lub innych problemach z reagowaniem, jest wywoływany w dziwnych miejscach, próbując nadać więcej czasu wątkom o niższym priorytecie.

Dlatego uniknąć zmieniając priorytety wątków i ponownego przemyślenia swój projekt jeśli naprawdę potrzebny Thread.sleep(50) się, że dokładne!