2013-10-15 12 views
6

Używam LinkedBlockingQueue jako kolejka pracy w ThreadPoolExecutor. Problem polega na użyciu ograniczonego LinkedBlockingQueue lub nieograniczonego LinkedBlockingQueue. Nadpisałem metodę wykonywania ThreadPoolExecutor i nie napotykałem problemu tworzenia wątków po głównym rozmiarze puli.Co jest lepsze LinkedBlockingQueue nieograniczone lub LinkedBlockingQueue o pojemności

Więc proszę powiedz mi, który będzie lepszy do użycia LinkedBlockingQueue z ograniczeniem lub bez ograniczeń.

Dzięki Tushar

+0

Opublikowanie odpowiedniego kodu może nam pomóc w uzyskaniu odpowiedzi –

+1

Jeśli potrzebujesz ograniczonego, użyj ograniczonego, jeśli nie, użyj nieograniczonego! Jaka jest twoja podła dla ** lepszego **? Oba są jedną rzeczą, na rzeczy jest ograniczona, a inna jest nieograniczona! Proszę wyjaśnić swoje pytanie :) –

+0

Lepsze znaczy pod względem wykorzystania procesora, wykorzystania pamięci i przepustowości, tj. Ogólnej wydajności. Czy operacje ankiety i oferty mają różne statystyki wydajności w połączonej i zablokowanej blokowanej kolejce blokującej? – Scientist

Odpowiedz

4

Kolejka bez ograniczeń jest bezpiecznym sposobem, aby upewnić się, że żadne zadanie nie zostało odrzucone, lub użyj ograniczonej kolejki o takiej pojemności, która jest na tyle duża, że ​​może pomieścić maksymalną liczbę zadań, które mogą znaleźć się w aplikacji. To zależy od projektu twojej aplikacji. Myślę, że jeśli zrozumiesz (porozmawiaj z architektem) projekt aplikacji, będziesz mógł zdecydować o wielkości kolejki. A jeśli chodzi o pamięć i procesor, o ile nie dodasz zadań do kolejki, nie zwiększą się i będą takie same dla obu - nieograniczonych lub ograniczonych. (Testowane w aplikacji demo)

public static void main(String[] args) 
{ 
    LinkedBlockingQueue<Runnable> r = new LinkedBlockingQueue<Runnable>(11); 

    while(true) 
    { 
    // r.offer(new Task(1)); 
    } 
} 

po prostu baw się dobrze, aby sprawdzić.

0

Jeśli można oszacować, ile maksymalna liczba elementów oczekujących w kolejce może być lepiej będzie użyć kolejkę ograniczony. Wątki, które wstawiają elementy w kolejce, mogą wiedzieć, czy kolejka jest pełna po oszacowanym rozmiarze kolejki.

Wszystko zależy od zadania, które chcesz wykonać. Jeśli chcesz utworzyć wątki wstawiające elementy w kolejce w celu oczekiwania po maksymalnej liczbie oczekujących elementów w kolejce, powinieneś rozważyć powiązaną kolejkę.

Kolejki ograniczane będą lepsze pod względem pamięci i procesora, ponieważ tylko co najwyżej ograniczona liczba pozycji może znajdować się w kolejce (zaleta pamięci), a wątki będą wstawiać elementy do kolejki, aby poczekać, czy kolejka jest pełna (procesor) zasiłek). Ogólna wydajność zostanie poprawiona.

Będzie to miało dużą zaletę, gdy stawka kolejkowania w kolejce nie jest równa szybkości odladzania.

3

Bez ograniczeń LinkedBlockingQueue to po prostu ograniczona kolejka o pojemności java.lang.Integer.MAX_VALUE. Więc tak, jak wspomniano w komentarzach, używaj ograniczonej lub nieograniczonej kolejki w oparciu o twoje potrzeby, a nie dla wydajności, ponieważ sprawdzanie rozmiaru odbywa się niezależnie od tego, czy określasz limit, czy nie.

Jak zwykle, jeśli znasz pojemność z góry, poleciłbym profilowanie użycia nieograniczonej kolejki do ograniczonej z daną pojemnością, chociaż nie polecałbym tej trasy, chyba że masz dowód, że kolejka jest przyczyną problemy z wydajnością w aplikacji.

Powiązane problemy