Hoe een pool van taken uit te voeren met behulp van het ingestelde aantal Java/Groovy-threads zonder te blokkeren

Op dit moment heb ik deze Groovy-code om een ​​aantal taken uit te voeren:

    CountDownLatch latch = new CountDownLatch(tasks.size);

    for( task in tasks ) {
        Thread.start worker.curry(task, latch)
    }

    latch.await(300L, TimeUnit.SECONDS);

Ik zou het aantal gelijktijdige discussies willen beperken tot een bepaald aantal t . De manier waarop het nu is geschreven, voor n taken, n threads wordt "in één keer" aangemaakt. Ik dacht aan het gebruik van meerdere latches of een soort callback, maar kon geen goede oplossing bedenken.

De oplossing zou nieuwe taakthreads moeten starten zodra het uitvoeren van threads onder t komt, totdat het nummer t bereikt of er geen niet-uitgevoerde taken zijn.

2

2 antwoord

Bekijk GPars en gebruik een van de abstracties. U kunt vervolgens het nummer opgeven dat moet worden gemaakt in withPool (). Ik hou van vork/meedoen:

withPool(4) { pool ->
  runForkJoin(rootTask) { task ->
    task.eachTask { forkChild(task) }
  }
}
5
toegevoegd

U kunt het Executor-framework gebruiken.

Executors.newFixedThreadPool(t);

Hiermee maak je bij het starten n en alleen n threads. Vervolgens kunt u zich onderwerpen aan de uitvoerder om deze threads te gebruiken.

Bewerken: Bedankt voor de reactie Josh, ik zal je oplossing publiceren

ExecutorService pool = Executors.newFixedThreadPool(6); 
for( task in tasks ) { 
    pool.execute Worker.curry(task)
} 
pool.shutdown();
4
toegevoegd
Dit werkte voor mij. Voor de goede orde is de code ExecutorService pool = Executors.newFixedThreadPool (6); for (taak in taken) {pool.execute Worker.curry (task)} pool.shutdown ();
toegevoegd de auteur Josh Diehl, de bron