Concorrência em Java
As últimas APIs de concorrência do Java tornaram o trabalho de gerenciar a execução das tarefas muito mais fácil, mas existem alguns cuidados a serem observados. Primeiro, evite utilizar Executor e utilize ExecutorService. O problema é que a primeira interface não possui o método shutdown... o programa simplesmente não irá terminar. Para criar os executores: private ExecutorService exec; // ... int numProc = Runtime.getRuntime().availableProcessors(); exec = Executors.newFixedThreadPool(numProc); A classe que irá permitir o gerenciamento das filas e da lista de jobs é a CompletionService. E apesar de não ser fundamental, eu tenho criado uma lista de pendências para acompanhar a execução dos diversos jobs, dessa forma: CompletionService cs = new ExecutorCompletionService(exec); List > pendencias = new ArrayList >(); E a criação dos task a serem executadas: for (Fasta f : contigs) { Result res = new Result(); ...