2013-07-31 13 views
6

Czy istnieje klasa Java takie, że:Czy w języku Java istnieje wieloznaczna pula wątków z możliwością indeksowania?

  1. wykonywalne zadania mogą być dodawane za pomocą identyfikatora, w których zagwarantowane wszystkie zadania z tym samym identyfikatorem, aby nie biec równolegle
  2. Liczba wątków może być ograniczona do stała kwota:

Naiwne rozwiązanie mapy łatwo by się rozwiązało (1), ale byłoby trudno zarządzać (2). Podobnie, wszystkie klasy łączenia wątków, które znam, będą pobierane z pojedynczej kolejki, co oznacza, że ​​(1) nie jest gwarantowane.

Rozwiązania z udziałem bibliotek zewnętrznych są mile widziane.

+0

co próbowałeś>? – Makky

+0

@Makky, Byłem szczególnie patrząc na Spring TaskExecutor – 00500005

+2

@downvoters, dlaczego to jest złe pytanie? To nie jest pytanie "plz daj mi kod" i wydaje mi się, że byłby to dość powszechny przypadek użycia dla wielowątkowości, a googlowanie nie przynosi żadnych oczywistych rezultatów. – 00500005

Odpowiedz

3

Jeśli nie znajdziesz czegoś, co robi to po wyjęciu z pudełka, nie powinno być ciężko toczyć własne. Jedną rzeczą, jaką można zrobić, to owinąć każde zadanie w prosty klasy, który czyta w kolejce za unikalny identyfikator, np .:

public static class SerialCaller<T> implements Callable<T> { 
    private final BlockingQueue<Caller<T>> delegates; 

    public SerialCaller(BLockingQueue<Caller<T>> delegates) { 
     this.delegates = delegates; 
    } 

    public T call() throws Exception { 
     return delegates.take().call(); 
    } 
} 

To powinno być łatwe do utrzymania mapę identyfikatorów kolejek składania zadań. To spełnia warunek (1), a następnie możesz szukać prostych rozwiązań warunku (2), takich jak Executors. newFixedThreadPool

+0

Twoja wstępna propozycja wydawała się lżejsza i łatwiejsza do wdrożenia - jakikolwiek powód zmiany? – assylias

+1

@assylias Zdałem sobie sprawę, że to może być duże wąskie gardło. Załóżmy, że twoja pula wątków jest ograniczona do N wątków i masz N zadań pod id A, a także pewną liczbę pod id B i C. Niefortunnym zbiegiem okoliczności wszystkie zadania A zostają zaplanowane. Oznacza to, że wątki N-1 są blokowane - i nie wykonują zadań dla B lub C. – yshavit

+0

Czy mógłbyś wypełnić tę odpowiedź, dodając kod źródłowy o identyfikatorach mapowania do kolejek i zadań przesyłania i odpytywania? – Mojtabye

2

Myślę, że najprostszym rozwiązaniem jest posiadanie osobnej kolejki dla każdego indeksu i osobnego executora (z jeden wątek) dla każdej kolejki.

Jedyne, co można osiągnąć przy bardziej złożonym rozwiązaniu, to użyć mniejszej liczby wątków, ale jeśli liczba indeksów jest mała i ograniczona, prawdopodobnie nie jest to warte wysiłku.

2

Dla każdego identyfikatora potrzebny jest SerialExecutor, opisany w dokumentacji java.util.concurrent.Executor. Wszyscy seryjni wykonawcy delegują pracę do ThreadPoolExecutor z podanym corePoolSize.

Opcjonalną wersję SerialExecutor można znaleźć pod adresem my code samples.

+0

To ukryty skarb w dokumentacji Java! SerialExecutor skutecznie implementuje wielostopniową pulę wątków, ale tak naprawdę nie wyjaśnia tego. – blueimpb