[TimerTask] - Quando utiliza-las? [Resolvido]  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

Oi,

Um programa rodava em Thread. Foi resolvido modificar para TimerTask.

Acontece que nem sempre essas tasks ocorrem no tempo determinado em sua inicialização. Não sei o que acontece, elas simplesmente morrem?!

Quando utiliza-las?

Tchauzin!

This message was edited 1 time. Last update was at 30/11/2010 14:38:15


Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

Oi lina,

Como a TimerTask está sendo executada?
Vc está usando um Timer?

Pode passar o trecho de código?

[]´s

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

Dois links interessantes:
http://www.ibm.com/developerworks/java/library/j-schedule.html
http://oreilly.com/java/archive/quartz.html

[]´s

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

lina wrote:Oi,

Um programa rodava em Thread. Foi resolvido modificar para TimerTask.

Acontece que nem sempre essas tasks ocorrem no tempo determinado em sua inicialização. Não sei o que acontece, elas simplesmente morrem?!

Quando utiliza-las?

Tchauzin!



Para cada java.util.Timer, é criada uma thread que roda todas as TimerTasks associadas com ela. O que pode ocorrer:

a) Se uma TimerTask demorar mais que o devido, atrasa as outras, e
b) Se uma TimerTask morrer com uma exceção não tratada, mata a thread dessa TimerTask e você vai ver que as outras TimerTasks não serão executadas.

O caso b) pode ser resolvido usando um try { ..... } catch (Throwable thr) { ... } para evitar que a exceção escape e mate a thread.
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

davidbuzatto wrote:Oi lina,

Como a TimerTask está sendo executada?
Vc está usando um Timer?

Pode passar o trecho de código?

[]´s


Oi,

Estou criando assim:



Tchauzin!

Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

entanglement wrote:
lina wrote:Oi,

Um programa rodava em Thread. Foi resolvido modificar para TimerTask.

Acontece que nem sempre essas tasks ocorrem no tempo determinado em sua inicialização. Não sei o que acontece, elas simplesmente morrem?!

Quando utiliza-las?

Tchauzin!



Para cada java.util.Timer, é criada uma thread que roda todas as TimerTasks associadas com ela. O que pode ocorrer:

a) Se uma TimerTask demorar mais que o devido, atrasa as outras, e
b) Se uma TimerTask morrer com uma exceção não tratada, mata a thread dessa TimerTask e você vai ver que as outras TimerTasks não serão executadas.

O caso b) pode ser resolvido usando um try { ..... } catch (Throwable thr) { ... } para evitar que a exceção escape e mate a thread.


Oi,

Tanto a situação a) e b) notei isso já em produção (no cliente rs). E para tratar o item b) utilizei um catch(Exception ex) {.....} para ela não escapar!

Valeria a pena a criação de uma simples Thread para substituir a task? Lembrando que estamos falando de varias TimerTask...

Tchauzin!

This message was edited 1 time. Last update was at 25/11/2010 13:17:11


Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
Andre Brito
JWizard

Membro desde: 21/07/2007 17:44:31
Mensagens: 2485
Localização: Paraná
Offline

Lina,

Eu não gosto muito da Timer. Se você der uma olhada por aí, vai ver que não sou só eu que não acho a Timer muito legal (não é frescura minha não... a TimerTask e a Timer podem ser bem simples, mas elas tem alguns probleminhas). Você pode usar, ao invés, a classe ScheduledExecutorService, que é mais fácil, flexível e você tem mais controle sobre o agendamento (schedule) de tarefas.

Além disso, quando você usa a SES, você não precisa da TimerTask. Como você falou que existia algo que usava Thread (se você implementou do jeito legal, você provavelmente fez ela uma subclasse de Runnable), é só você colocar essa sua Thread na SES.

Como organizar o GUJ.
Meu Twitter.
Meu blog.
Future proofing means making code easy to change, not trying to anticipate every possible way your code might need to change.
[WWW]
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

Andre Brito wrote:Lina,

Eu não gosto muito da Timer. Se você der uma olhada por aí, vai ver que não sou só eu que não acho a Timer muito legal (não é frescura minha não... a TimerTask e a Timer podem ser bem simples, mas elas tem alguns probleminhas). Você pode usar, ao invés, a classe ScheduledExecutorService, que é mais fácil, flexível e você tem mais controle sobre o agendamento (schedule) de tarefas.

Além disso, quando você usa a SES, você não precisa da TimerTask. Como você falou que existia algo que usava Thread (se você implementou do jeito legal, você provavelmente fez ela uma subclasse de Runnable), é só você colocar essa sua Thread na SES.


Oi,

Obrigada! Vou dar uma olhada no SES...

Tchauzin!

Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

Oi,

Passei a utilizar o ScheduledThreadPoolExecutor.

Desta maneira:


O grande problema agora é como parar essa ThreadPoolExecutor.
Estou chamando o método shutdownNow e nada. A mesma marca como Terminated, porém continua executando o Runnable. Vai saber?!

Tchauzin!

Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

De modo geral, só é possível encerrar um Callable ou Runnable se ele sair com um InterruptedException, ou se ficar examinando uma flag. Isso é porque shutdown ou shutdownNow faz exatamente isso (lança uma InterruptedException em todas as threads que estão sendo usadas pelo Executor. )

Para isso ocorrer:

a) Ou esse Callable ou Runnable tem algum ponto do código que seja interruptível com um InterruptedException (por exemplo, ler ou gravar de arquivos ou sockets, Thread.sleep, ou algum método de alguma classe de java.util.concurrent que saia com InterruptedException) , ou
b) Você pode checar uma flag. No caso em que o Runnable ou Callable tem acesso a um Future, por exemplo (veja http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html ) é possível checar o valor de isCancelled.

This message was edited 1 time. Last update was at 30/11/2010 13:55:47

lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

entanglement wrote:De modo geral, só é possível encerrar um Callable ou Runnable se ele sair com um InterruptedException, ou se ficar examinando uma flag. Isso é porque shutdown ou shutdownNow faz exatamente isso (lança uma InterruptedException em todas as threads que estão sendo usadas pelo Executor. )

Para isso ocorrer:

a) Ou esse Callable ou Runnable tem algum ponto do código que seja interruptível com um InterruptedException (por exemplo, ler ou gravar de arquivos ou sockets, Thread.sleep, ou algum método de alguma classe de java.util.concurrent que saia com InterruptedException) , ou
b) Você pode checar uma flag. No caso em que o Runnable ou Callable tem acesso a um Future, por exemplo (veja http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html ) é possível checar o valor de isCancelled.


Oi,

Pois então... vou fazer assim.... no meu teste funcionou!

Obrigada!

Tchauzin!
[Email]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team