2010-03-09 11 views
6

Mam wiele wątków, każdy z własną prywatną kolejką współbieżną i wszystko, co robią, to uruchamianie nieskończonej pętli pobierania wiadomości z niego. Może się zdarzyć, że jedna z kolejek nie odbierze wiadomości przez pewien okres czasu (może kilka sekund), a także może dojść do dużych wybuchów i konieczne jest szybkie przetwarzanie.Współbieżność Java - czy należy zablokować lub zwiększyć wydajność?

Chciałbym wiedzieć, co byłoby najbardziej odpowiednie do zrobienia w pierwszym przypadku: użyj kolejki blokowania i zablokuj wątek, dopóki nie będę mieć więcej danych wejściowych lub wykonaj Thread.yield()?

Chcę mieć jak najwięcej zasobów procesora w danym momencie, ponieważ liczba jednoczesnych wątków może wzrastać z czasem, ale też nie chcę, aby przetwarzanie komunikatów było opóźnione, ponieważ nie ma żadnej gwarancji od momentu, w którym wątek zostanie ponownie zaplanowany do wykonania przy wydajności(). Wiem, że sprzęt, system operacyjny i inne czynniki odgrywają tutaj ważną rolę, ale odsuwając je i patrząc na nie z punktu widzenia Javy (JVM?), Jaki byłby najbardziej optymalny?

Odpowiedz

9

Zawsze po prostu blokuj w kolejkach. Wydajność Java w kolejkach wewnętrznie.

Innymi słowy: Nie można uzyskać żadnej korzyści z wydajności w innych wątkach, jeśli ustępujesz w jednym z nich zamiast po prostu blokować.

+0

Nie, po prostu spróbuj biblioteki [disruptor] (https://github.com/LMAX-Exchange/disruptor). Wydaje się, że najlepsze wyniki osiągnął tylko zysk! – qinxian

7

Z pewnością chcesz użyć kolejki blokującej - są one zaprojektowane dokładnie w tym celu (chcesz, aby wątki nie używały czasu procesora, gdy nie ma żadnej pracy).

Thread.yield() to niezwykle temperamentalna bestia - planista odgrywa dużą rolę dokładnie w tym, co robi; i jedną prostą, ale ważną implementacją jest po prostu nic nie robić.

0

Ewentualnie rozważ konwersję implementacji, aby użyć jednej z zarządzanych implementacji ExecutorService - prawdopodobnie ThreadPoolExecutor.

To może nie być odpowiednie dla twojego przypadku użycia, ale jeśli tak jest, to usuwa cały ciężar martwienia się o zarządzanie wątkami z twojego własnego kodu - i te pytania o ustępowanie, czy nie po prostu znikają.

Ponadto, jeśli w przyszłości pojawią się lepsze algorytmy zarządzania wątkami - na przykład coś podobnego do Apple'a Grand Central Dispatch - możesz przekonwertować aplikację, aby z niego korzystać bez większego wysiłku.

0

Inną rzeczą, którą możesz zrobić, to użyć współbieżnej mapy skrótów dla swojej kolejki. Kiedy robisz lekturę, dajesz odniesienie do poszukiwanego obiektu, więc możliwe, że przegapisz wiadomość, która właśnie została umieszczona w kolejce. Ale jeśli wszystko to, co robisz, to słuchanie wiadomości, możesz ją złapać w następnej iteracji. Byłoby inaczej, gdyby wiadomości mogły być aktualizowane przez inne wątki. Ale tak naprawdę nie wydaje się, żeby blokować to, co widzę.

Powiązane problemy