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
)
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
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
Tags: Java
Muito boa dica.
só uma coisa o FutureTask é ele que vai garantir o sincronismo?
[Translate]
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 …
[Translate]
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?
[Translate]
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
se tu explicar melhor o que é trancada, ai posso tentar ajudar em qual seria a solução
[Translate]
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.
[Translate]
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
[Translate]
Cara valeu pelas dicas…
[Translate]
o que representa o 5 no constructor?
na javadoc está um pouco diferente:
FutureTask(Runnable runnable, V result)
[Translate]
@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.
[Translate]