pessoal, eu peço desculpa pro ter revivido o tópico, se bem que o assunto é ± o mesmo.
eu quero criar um pool de threads para fazer determinado trabalho, então aproveitei o exemplo do genildof, porém usando FixedThreadPool, ja que quero um tamanho fixo para o pool de threads. O problema é que as vezes alguma thread não é finalizada, enquanto que outras vezes executa certinho, a quantidade de threads do pool que executa por ciclo, e depois fecha todas, se alguma só pode entrar para executar depois que a fila estava vazia ela simplesmente termina, o ruim é quando essa ultima thread não termina, o que é o mais comum…
alguém saberia me dizer como corrigir isso?
segue o código do nosso amigo ai abaixo, depois que adaptei:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
public class testeThread {
public static void main(String[] args) {
BlockingQueue q = new LinkedBlockingQueue();
ExecutorService threadPool = Executors.newFixedThreadPool(3);
//ExecutorService threadPool = Executors.newCachedThreadPool();
Produtor p = new Produtor(q);
threadPool.execute(new Produtor(q));
threadPool.execute(new Consumidor(q, "primeira"));
threadPool.execute(new Consumidor(q, "segunda "));
threadPool.execute(new Consumidor(q, "terceira"));
threadPool.execute(new Consumidor(q, "quarta "));
threadPool.execute(new Consumidor(q, "quinta "));
threadPool.shutdown();
}
}
class Produtor implements Runnable{
private final BlockingQueue queue;
Produtor(BlockingQueue q) {queue = q;}
public void run() {
Thread.currentThread().setPriority(10);
try {
for (int i = 0; i <= 30; i++) {
System.out.println("Adicionando tarefa " + i);
queue.put("tarefa " + i);}
} catch (InterruptedException ex) {
ex.printStackTrace();}
}
}
class Consumidor implements Runnable{
private final BlockingQueue queue;
private String nome;
public String getNome(){ return nome; }
Consumidor(BlockingQueue q, String nome) {this.queue = q; this.nome = nome;}
public void run() {
Thread.currentThread().setPriority(2);
while(queue.isEmpty() == false) {
try {
System.out.println("Executando " + nome + " - " + queue.take());
Thread.sleep(500); // Simula delay real do consumidor
} catch (InterruptedException ex) {
ex.printStackTrace();}
}System.out.println("terminando thread "+nome);
}
}
um exemplo de saida onde todas as threads terminam certinho:
Adicionando tarefa 0
Adicionando tarefa 1
Adicionando tarefa 2
Adicionando tarefa 3
Adicionando tarefa 4
Adicionando tarefa 5
Adicionando tarefa 6
Adicionando tarefa 7
Adicionando tarefa 8
Adicionando tarefa 9
Adicionando tarefa 10
Adicionando tarefa 11
Adicionando tarefa 12
Adicionando tarefa 13
Adicionando tarefa 14
Adicionando tarefa 15
Executando terceira - tarefa 0
Executando segunda - tarefa 1
Executando primeira - tarefa 2
Executando segunda - tarefa 3
Executando primeira - tarefa 5
Executando terceira - tarefa 4
Executando primeira - tarefa 6
Executando terceira - tarefa 8
Executando segunda - tarefa 7
Executando primeira - tarefa 9
Executando segunda - tarefa 11
Executando terceira - tarefa 10
Executando primeira - tarefa 12
Executando terceira - tarefa 14
Executando segunda - tarefa 13
Executando primeira - tarefa 15
terminando thread terceira
terminando thread quarta
terminando thread quinta
terminando thread segunda
terminando thread primeira
agora um exemplo onde alguma não termina, eu acabo precisando fecha pelo botão do proprio eclipse:
Adicionando tarefa 0
Adicionando tarefa 1
Adicionando tarefa 2
Adicionando tarefa 3
Adicionando tarefa 4
Adicionando tarefa 5
Adicionando tarefa 6
Adicionando tarefa 7
Adicionando tarefa 8
Adicionando tarefa 9
Adicionando tarefa 10
Adicionando tarefa 11
Adicionando tarefa 12
Adicionando tarefa 13
Adicionando tarefa 14
Adicionando tarefa 15
Executando terceira - tarefa 0
Executando primeira - tarefa 1
Executando segunda - tarefa 2
Executando terceira - tarefa 3
Executando primeira - tarefa 4
Executando segunda - tarefa 5
Executando terceira - tarefa 6
Executando primeira - tarefa 7
Executando segunda - tarefa 8
Executando terceira - tarefa 9
Executando primeira - tarefa 10
Executando segunda - tarefa 11
Executando primeira - tarefa 12
Executando terceira - tarefa 13
Executando segunda - tarefa 14
Executando terceira - tarefa 15
terminando thread segunda
terminando thread quarta
terminando thread quinta
terminando thread terceira
nessa execução ai, foi a primeira que não terminou, mais nem sempre é ela, tiveram outras vezes também que quem não termina é a segunda por exemplo, conforme abaixo:
Adicionando tarefa 0
Adicionando tarefa 1
Adicionando tarefa 2
Adicionando tarefa 3
Adicionando tarefa 4
Adicionando tarefa 5
Adicionando tarefa 6
Adicionando tarefa 7
Adicionando tarefa 8
Adicionando tarefa 9
Adicionando tarefa 10
Adicionando tarefa 11
Adicionando tarefa 12
Adicionando tarefa 13
Adicionando tarefa 14
Adicionando tarefa 15
Executando terceira - tarefa 0
Executando segunda - tarefa 1
Executando primeira - tarefa 2
Executando terceira - tarefa 3
Executando primeira - tarefa 5
Executando segunda - tarefa 4
Executando primeira - tarefa 6
Executando segunda - tarefa 8
Executando terceira - tarefa 7
Executando segunda - tarefa 9
Executando terceira - tarefa 11
Executando primeira - tarefa 10
Executando segunda - tarefa 12
Executando primeira - tarefa 14
Executando terceira - tarefa 13
Executando primeira - tarefa 15
terminando thread terceira
terminando thread quarta
terminando thread quinta
terminando thread primeira