2011-07-06 10 views
5

Używam programu BlockingQueue o stałej wielkości [ArrayBlockingQueue] w aplikacji typu producent/konsument, ale chcę, aby użytkownik mógł zmieniać rozmiar kolejki w locie. Problem polega na tym, że nie ma implementacji BlockingQueue, która umożliwia zmianę pojemności po utworzeniu. Ktoś kiedykolwiek spotkał się z tym wcześniej? Jakieś pomysły?Przeredukowana Java BlockingQueue

Odpowiedz

1

Można rozszerzyć LinkedBlockingQueue. Jej limit to ograniczenie miękkie (czyli po prostu dodatkowy check) i można zrobić to coś można zmienić (poprzez wyłączenie wbudowanego w jednym i wprowadzenie własnych)

+0

Nie jest to możliwe bez kopiowania/wklejania dużej ilości kodu wewnętrznego. Naprawdę musiałbyś zabrać piłę łańcuchową do osobnej implementacji, np. Tej w Apache Harmony. – jbellis

+0

@jbellis dlaczego musiałbyś skopiować kod do podklasy? –

+3

Nie można uzyskać pożądanej funkcjonalności tutaj poprzez jej podklasę; zbyt wiele jest ostateczne/prywatne. – jbellis

2

Najbardziej oczywiste rozwiązanie (może lub nie może być odpowiednie w zależności od okoliczności) byłoby po prostu utworzenie kolejki nowej z żądaną zaktualizowaną pojemnością. Następnie przenieś wszystko ze starej kolejki do nowej.

+0

Jeśli to zrobisz, wszystkie wątki z odniesieniem do starej kolejki będą blokowane, czekając na nową zawartość w starej kolejce, a nie nową zawartość w nowej kolejce. –

+1

@bkail: Właśnie dlatego powiedziałem "w zależności od okoliczności". Jeśli OP ma wiele odniesień do kolejki blokującej, to będzie musiał naprawić, aby to rozwiązanie działało (np. Poprzez owijanie samej kolejki wewnątrz obiektu kontenera, który działa jako kolejka zewnętrznie, ale wykonuje nowe alokacje wewnętrznie, gdy pojemność jest zmienione). –

Powiązane problemy