Blog do Urubatan
msgbartop
Desenvolvedor, Palestrante, Escritor, Nerd Assumido e Pai do Marcus :D
msgbarbottom

29 Sep 06 estou me apaixonando pelo java.util.concurrent

Bom, este post não contem nenhum tutorial, nem nada assim …
mas fica a dica para quem estiver tendo problemas com multi threading, locking de threads, locking de recursos, …
E como eu, entende menos disto do que o pessoal que implementou o java.util.concrrent …
Eu não lembro agora o nome do cara que criou a biblioteca que deu origem ao java.util.concurrent, mas meus parabens pra ele. (se não me engano foi o Doug Lea mas não tenho certeza agora, e to sem tempo de procurar no google pra confirmar :D )

Bom, fica a dica então, estudem pacote novo do JDK 5.0.

e só pra este post não ficar sem código nenhum, o que "salvou o meu dia", na verdade foi a semana, que passei brigando com isto :D
foi o código a baixo …

FutureTask f = new FutureTask(r, 5); //r é um Runnable
             polledExecutor.execute(f);
 try {
                 f.get(40, TimeUnit.SECONDS);
                 f.cancel(true);
             } catch (InterruptedException e) {
                 f.cancel(true);
                 //Código para logar a excessão
             } catch (ExecutionException e) {
                 f.cancel(true);
                 //Código para logar a excessão
             } catch (TimeoutException e) {
                 f.cancel(true);
                 //Código para logar a excessão
             }

yeap, eu sei que com uma thread por execução eu poderia fazer a mesma coisa, usando o Thread.sleep, mas este código esta dentro de um loop, e assim eu teria um montão de threads, o que me causaria problemas com o hosting :D

If you enjoyed this post, make sure you subscribe to my RSS feed!

Tags:

Reader's Comments

  1. |

    Muito boa dica.
    só uma coisa o FutureTask é ele que vai garantir o sincronismo?

    Reply to this comment
  2. |

    o fturetask não vai garantir sincronismo, no exemplo apresentado, ele vai garantir que a tarefa leve no máximo X segundos para ser executada, caso contrario é abortada …

    Reply to this comment
  3. |

    ok, se eu tiver uma thread.
    e não importa para mim quanto tempo ele
    vai demorar o que não pode acontecer é ela ficar
    trancada. como poderia tratar isso?

    Reply to this comment
  4. |

    se você tiver uma thread e não se importar quanto tempo ela vai demorar, ai tu vai ter que definir o que é ela ficar trancada para poder monitorar isto …
    trancada é aguardando um lock? mas aguardando por quanto tempo? trancada é rodando para sempre? mas quanto é para sempre?
    dependendo do que tu considerar “trancada” vai ter que ter um tratamento especial para cada caso …
    se for o tempo de execução, este código que mostrei a cima pode ajudar, se for outro critério ai tem que procurar outra solução :D
    se tu explicar melhor o que é trancada, ai posso tentar ajudar em qual seria a solução :D

    Reply to this comment
  5. |

    tenho um banco de dados(mysql, com mais de 8 milhoes de registros), devido o numero de
    consultas no banco, algumas vezes o consulta fica em lock.
    empilhando as threads. o que acabei de fazer, a parte de acesso a esta consulta, coloquei esta classe que tu apresentou.
    aparentimente resolveu.

    Agora ele esta executando esta consulta, se demorar mais de
    2 segundos é executado o timeout.

    Reply to this comment
  6. |

    como você esta fazendo o acesso ao banco de dados?
    esta usando hibernate ou alguma outra forma dentro de um servidor de aplicações que suporte JTA? se sim tu pode usar transaction timeout, e não precisa te preocupar com isto …
    (o hibernate suporta transaction timeout a partir da versão 3.1 só eu acho … )
    se não for nenhuma destas opções, ai esta solução do exemplo a cima é uma boa solução para o problema :D

    Reply to this comment
  7. |

    Cara valeu pelas dicas…

    Reply to this comment
  8. |

    o que representa o 5 no constructor?

    na javadoc está um pouco diferente:

    FutureTask(Runnable runnable, V result)

    Reply to this comment
  9. |

    @chico paes

    o 5 no construtor é o valor padrão q será retornado após a execução da FutureTask f. como esta api surgiu no java 5, ela foi projetada com total suporte de tipos parametrizados (generics), logo o V é o tipo genérico que será retornado, no caso do exemplo, um integer.

    Reply to this comment

Leave a Comment