Jak pracować z ConcurrentLinkedQueue, jak mogę ograniczyć rozmiar kolejki. Czy to możliwe, że nastąpi to poprzez wyjątek wyjątku?Zapobieganie ConcurrentLinkedQueue <T> z outofmemory Wyjątek
6
A
Odpowiedz
5
Rozmiar ConcurrentLinkedQueue
jest nieograniczony, więc jeśli producenci wprowadzają elementy szybciej niż konsumenci mogą je usunąć, w końcu rzeczywiście pochłonie pamięć. Jeśli chcesz ograniczyć rozmiar kolejki, spróbuj zamiast tego kolejki blokującej, takiej jak LinkedBlockingQueue
lub ArrayBlockingQueue
. Rozmiar pierwszego może być opcjonalnie ograniczony, podczas gdy drugi jest zawsze ograniczony.
0
Trochę się spóźniam na tę, ale zawsze możesz ustawić górną granicę, a po jej przekroczeniu twoja metoda zużyje jeden żeton, aby zrobić miejsce na następną i tak dalej.
Dziękuję za odpowiedź, ale użyłem ConcurrentLinkedQueue, ponieważ jest to współbieżne. Czy sugerujesz niezwiązane klasy, które będą wymagały dodania synchronizacji podczas uzyskiwania dostępu do tych zmiennych? – Youval
@Można wykonać wszystkie implementacje 'BlockingQueue' w sposób bezpieczny dla wątków, jak zadeklarowano w [dokumentacji API] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html). –
Jednak blokowanie wątku może mieć wpływ na ogólną wydajność aplikacji w bardzo równoczesnych aplikacjach. Są więc wady i zalety. –