2012-11-20 17 views
6

Jak mogę ograniczyć liczbę wątków, które są wykonywane w tym samym czasie? Oto próbka mojego algorytmu:Ogranicz liczbę wątków w Groovy

for(i = 0; i < 100000; i++) { 
    Thread.start { 
     // Do some work 
    } 
} 

Chciałbym się upewnić, że gdy liczba wątków w mojej aplikacji trafia 100, algorytm będzie wstrzymać/poczekać do liczby wątków w aplikacji spadnie poniżej 100.

Obecnie "trochę pracy" zajmuje trochę czasu i kończę z kilkoma tysiącami wątków w mojej aplikacji. W końcu kończy się wątki i awarie "niektórych prac". Chciałbym to naprawić, ograniczając liczbę pul, z których może korzystać jednocześnie.

Proszę dać mi znać, jak rozwiązać mój problem.

Odpowiedz

10

Wierzę, że szukasz ThreadPoolExecutor w Java Concurrency API. Pomysł polega na tym, że możesz zdefiniować maksymalną liczbę wątków w puli, a następnie zamiast uruchamiać nowe wątki z Runną, pozwól, aby ThreadPoolExecutor zajął się zarządzaniem górnym limitem wątków.

Rozpocznij tutaj: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

import java.util.concurrent.*; 
import java.util.*; 

def queue = new ArrayBlockingQueue<Runnable>(50000) 
def tPool = new ThreadPoolExecutor(5, 500, 20, TimeUnit.SECONDS, queue); 

for(i = 0; i < 5000; i++) { 
    tPool.execute { 
     println "Blah" 
    } 
} 

Parametry konstruktora ThreadBlockingQueue: corePoolSize (5), jest to # wątków do tworzenia i utrzymania, jeżeli system jest bezczynny, maxPoolSize (500) maksymalna liczba wątków do tworzenia, 3 i Czwarty argument określa, że ​​pula powinna utrzymywać bezczynne wątki przez co najmniej 20 sekund, a argumentem kolejki jest kolejka blokująca, która przechowuje zadania w kolejce.

To, w czym chcesz się bawić, to rozmiary kolejki, a także obsługa odrzuconych zadań. Jeśli potrzebujesz wykonać zadania 100k, będziesz musiał mieć kolejkę, która może pomieścić 100 tys. Zadań, lub będziesz musiał mieć strategię obsługi odrzuconych zadań.

+0

Czy można uzyskać mały przykład? – MeIr

+0

@Melr - dodałem przykład, proszę. –

+0

O dziwo, ale powyższy przykład nie działa zgodnie z oczekiwaniami w Grails :(Dziękuję za odpowiedź, myślę, że być może będę musiał zadać inne pytanie, specyficzne dla środowiska Grails – MeIr

Powiązane problemy