Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

318nuno

Método com limite de tempo de execução

Mensagens Recomendadas

318nuno

Tenho de programar um método em java que deve ter um limite de tempo de execução.

Queria saber então, qual a melhor forma de forçar a interrupção da execução do metódo quando o tempo limite for atingido.

Alguem me pode ajudar?

Obrigado pela atenção :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
merlin3000

Mas a ideia é por um método a executar uma determinada tarefa em ciclo ou uma única vez mas que a duração da tarefa não pode exceder um determinado tempo? Se for o primeiro caso, podes simplemente por um while no método em que a cada iteração verificas se já passou o tempo.

No segundo caso a coisa é mais complicada, mas o melhor será pores a tarefa não só a correr num método diferente, mas sim numa thread diferente, a qual possas interromper. O problema com esta abordagem é, se estiveres a usar sincronização ao terminar abruptamente uma thread podes ficar em deadlock, mesmo não estando se terminares uma tarefa a meio podes ficar com os dados num estado desconhecido o que pode também levantar problemas.

É melhor especificares um pouco o tipo de tarefa que queres executar e se o funcionamento seria então em loop ou uma única tarefa demorada.


Criar é Divertido

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
318nuno

A ideia é mesmo executar uma única tarefa (não é cíclica) num tempo limitado. Depois de chamado o método, ao ser atingido o limite de tempo, caso isso aconteça, ele deve ser interrompido.

Quanto à questão de os dados ficarem num estado desconhecido, não é problema, porque o método apenas irá tratar dados que já existem, e se por ser interrompido não o fizer, o comportamento do progrma não é comprometido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Não há forma nenhuma correcta de fazer isso. Nunca deves interromper um thread durante a execução e não tens como interromper um método durante a sua execução, aliás, a questão de querer limitar um método num determinado tempo não tem muita lógica...

Eventualmente podes colocar o método numa thread e forçar a thread a fechar, mas o comportamento da tua aplicação depois disso pode provocar outros problemas, não é algo que afecte apenas os dados em que estás a mexer, pode, por exemplo, acontecer que a thread mais tarde volte a executar, que não seja terminada correctamente ou que afecte a execução da thread principal, e aí afecta todo o teu programa.

Uma outra alternativa seria, a cada linha de código veres se podes continuar, mas isso é ainda mais absurdo. Para piorar, Java não te permite um controlo exacto do tempo, pelo que o tempo que definiste pode já ter passado e mesmo assim o método continuar a executar por não teres sido notificado da passagem de tempo.

Há alguma razão incontornável para que tenhas de limitar o tempo de execução?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
318nuno

Na verdade a razão não é completamente incontornável, mas tal seria muito útil...

Estou a participar num torneio de CodeInvadares, que é um jogo de combate espacial.

O objectivo é implementar-mos a classe da nossa própria nave. Para isso há apenas dois métodos a programar. Um initialize que é chamado apenas no inicio do jogo. E um move que é chamado em cada turno (cada partida é uma sequência de vários turnos). Ambos os métodos tem um limite de tempo para terminarem e caso o excedam, o move não volta a ser chamado durante a partida. E claro que seria no mínimo frustrante perder uma partida por esse motivo.

Quanto a Threads descobri agora as regras do jogo não permitem usa-las.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Essa limitação de tempo não deve ser contornada com a interrupção do método a meio, deve ser evitada com implementação mais cuidada. Terminares o método a meio da execução é tão prejudicial para o teu resultado no torneio como passares o limite de tempo e perderes umas jogadas.

Nem devias estar à procura de uma solução para um problema que, para todos os efeitos não existe, devias estar a tentar melhorar a tua implementação porque duvido que uma implementação cuidada exceda o limite de tempo permitido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
318nuno

O problema é que ao exceder o limite de tempo uma vez não se perde a jogada. Simplesmente o move() da nossa classe da nave deixa ser chamado e dessa forma perdem-se, na verdade, todas as jogadas subsequentes. O que pode ser o suficiente para perder a partida. Basta pensar numa situação em que o limite seja excedido logo no inicio, que basicamente seria o mesmo que ter a nave parada sem fazer um único ponto durante toda a partida. E isto por o move() exceder o limite de tempo uma única vez, o que não significa necessariamente que a implementação do método não seja cuidada.

Um método que excedesse o limite de tempo uma única vez em 10000 execuções não estaria bem implementado?

No entanto, se essa vez fosse no primeiro move() da primeira partida seria o suficiente para perder o torneio.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Um método que excedesse o limite de tempo uma única vez em 10000 execuções não estaria bem implementado?

Denota que existe um problema na implementação e é aí que terás de procurar uma resolução. É literalmente impraticável para um método a meio só para evitar essa situação que mencionas.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
318nuno

só mais uma questão, então e não existe nenhuma maneira de usar algo parecido com um timer que lançasse excepções quando atingisse o tempo limite?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Existe forma de usar um timer sim, mas um timer implica o uso de threads, o próprio timer é uma thread. E não dá para usares excepções, além de não terem sido feitas para isso, os timers lançam eventos e não excepções.

No entanto, continuas à procura de uma solução para um problema errado. Além disso, tecnicamente, estás a tentar fazer algo que não é viável, um método parar a meio e ficar num estado indefinido não é algo que seja vantajoso.

Concentra os esforços em melhorar o método e não em manter a nave em jogo de forma artificial. Um método bem implementado tem um tempo de execução constante e será sempre o mesmo.

E reitero, mesmo que tivesses forma de "matar" o método a meio, de forma correcta, o Java não te dá precisão que garanta controlo exacto sobre o tempo e corres o risco de passar o limite na mesma.

Agora, para arrumar o assunto, podes usar uma "técnica", depois de cada linha de código fazes um if a ver se o tempo que passou tem um determinado intervalo e se sim, fazes simplesmente um return. Efectivamente termina o método, mas garanto-te que é o pior código que pode ser feito.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.