[RESOLVIDO]Como descobrir se uma variável ainda será utilizada dentro de ThreadPool?

5 respostas
marco_andre

Boa tarde pessoal, estou com uma dúvida relacionada ao ThreadExecutor.
Para saber a threads concluídas, pensei em usar a classe Future, mas como saber se o AIW ainda será utilizado por mais alguma thread do pool?

5 Respostas

gomesrod

Por que não fechar no final do run() ?
Afinal parece que esse objeto é instanciado um por tarefa (ou seja, nao é reaproveitado para um auth diferente), entao inclua o fechamento como parte da própria tarefa.

marco_andre

Isso faz sentido gomesrod, o problema é que o asynchronousIndexWriter deve ser reaproveitado para cada arquivo pertencente a cada usuário, ou seja, deve existir 1 asynchronousIndexWriter para cada auth. Se eu fechá-lo no final do run(), o fechamento ocorrerá após a primeira indexação

gomesrod

Olá,

Acabei de ver a parte que eu tinha entendido errado:
Para cada auth é instanciado um writer (asynchronousIndexWriter = new AsynchronousIndexWriter(...) ), e depois ele é usado para várias tasks (threads), uma para cada arquivo.
À primeira vista pensei que era uma task por auth, e assim o writer seria usado por uma única thread. Foi mal! :)

Mas voltando ao problema:
Acho que a primeira coisa a fazer seria guardar referências para cada um desses writers:

ExecutorService pool = Executors.newFixedThreadPool(cpus + 1);  
List<AsynchronousIndexWriter> writers = new ArrayList<AsynchronousIndexWriter>();  // <----------
for (final File auth : auths) {  
       //...
       final AsynchronousIndexWriter asynchronousIndexWriter = new AsynchronousIndexWriter(writer);
       writers.add(asynchronousIndexWriter);  // <----------

       for (final File f : auth.listFiles()) {  
               // ....
Agora no final de tudo já pode fazer algo como:
for (AsynchronousIndexWriter asynchronousIndexWriter : writers) {
      asynchronousIndexWriter.close();
}

Detalhe:
Quando chega nesse ponto todas as tasks já terminaram de executar (garantido por awaitTermination() e shutdownNow() ), então estou presumindo que os AsyncronousIndexWriters já terminaram seu trabalho também.
Porém não conheço essa classe, e pelo nome aparentemente ela faz alguma coisa de forma assincrona, talvez criando suas próprias threads. Nesse caso, antes de fechar seria preciso um segundo controle para ver se cada uma já terminou o serviço. Verifique a classe para saber se isso é necessário.

E

Quando você está com problemas de tempo de vida de threads, é essencial desenhar um diagrama de atividades UML.

http://www.agilemodeling.com/artifacts/activityDiagram.htm

Você deve desenhar todos os “fork” e “join” que forem necessários. Usualmente o “join” pode ser representado por um “get” (no caso do Callable) ou um “join” (no caso de uma Thread).

marco_andre

Cara, fiz exatamento isso, o código tá igual ao que fiz, só ainda não tinha lembrado de passar aqui para postar a resposta.
Valeu pela ajuda ai :smiley:

Criado 10 de dezembro de 2012
Ultima resposta 11 de dez. de 2012
Respostas 5
Participantes 3