Cronometro regressivo em minutos[RESOLVIDO]

Boa tarde Pessoal, procurei durante algum tempo algo neste sentido aqui no forum, porem nenhum atendia a minha necessidade, entao graças ao nosso amigo Vini Godoy que indicou o JodaTime eu resolvi escrever meu cronometro regressivo, nao sei se eu posso postar este codigo aqui, caso contrario, por favor movam se quiserem ou deletem caso seja contrario as normas do guj ok?

import org.joda.time.DateTime;
import org.joda.time.DateTimeFieldType;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Cronometro {
    private static int segundos;
    private static DateTime dt;
    private static DateTime tempoSomado;

    public Cronometro(final int minutos) {
        Cronometro.dt = new DateTime(0);
        Cronometro.tempoSomado = Cronometro.dt.plusMinutes(minutos);
    }

    public static void main(final String[] args) throws InterruptedException {
        String s = "";
        Cronometro cron = new Cronometro(1);
        while (!(s = cron.contagemRegressiva()).equals("00:00")) {
            System.out.println(s);
        }
     }

    public String contagemRegressiva() throws InterruptedException {
        DateTimeFormatter df = DateTimeFormat.forPattern("mm:ss");
        String s = "";
        Cronometro.tempoSomado = Cronometro.tempoSomado.minusSeconds(1);
        Thread.sleep(1000);

        s = df.print(Cronometro.tempoSomado);
        return s;
    }

    public static void contagemRegressiva(final int minutos, final String mensagem) throws InterruptedException {
        DateTime dt = new DateTime(0);
        DateTime tempoSomado = dt.plusMinutes(minutos);
        DateTimeFormatter df = DateTimeFormat.forPattern("mm:ss");
        String s = "";
        while (!s.equals("00:00")) {
            tempoSomado = tempoSomado.minusSeconds(1);
            Thread.sleep(1000);
            s = df.print(tempoSomado);
            System.out.println(s);
        }
        System.out.println(mensagem);
    }

nunca usei o JodaTime, mas qual a vantagem em relação à Calendar da API interna do Java?

Tem mais possibilidades de se trabalhar com datas, periodos, cronologia e tal.

Não testei o que seu código é capaz, mas, já fiz um usando a classe Calendar:

:arrow: http://www.guj.com.br/java/271494-resolvido-timer-regressivo-como-implementar

:thumbup:

@rapzodo10: humm, teria algum exemplo de alguma vantagem do JodaTime? Tudo que vi no seu cronometro tem método no Calendar que faça o mesmo, e da mesma forma… (obs, para o minusSeconds(1), eu usaria cal.add(Calendar.SECOND, -1))

só uma coisa, esse “Thread.sleep(1000)” não seria o mais indicado, visto que outras operações vão estar concorrentes no processador, e isso pode causar um retardo entre um Thread.sleep e outro. Acho que poderia ser feito um cálculo para reduzir o valor de descanso no “Thread.sleep” de acordo com a diferença entre um sleep e outro, e/ou, usar a diferença da data do sistema com quanto falta para zerar o cronometro.

Pois eh evefuji , sei que o sleep(time) nao é confiavel, por isso demorei pra escrever este codigo exatamente pq nao queria usa-la, para a minha necessidade, nao haverao threads concorrentes nao, eh apenas uma cronometro simples para um scoreboard sabe, placar. Entao nao preciso fazer nada com hora do sistema nem nada, simplesmente o usuario seta os minutos, o contador faz a contagem e ao final finaliza a partida. Quanto as outras funcionalidades do joda, eu nao tenho mais nenhum exemplo, apenas li a documentacao e gostei mais, sempre havia usado a calendar, mas queria gostei do cronometro do nosso amigo InicianteJavaHenrique, tambem havia utilizado ja a timer, mas alguns dizem pra usar sleep, outros a timer, no fim, como disse, para a minha necessidade no momento, isto foi o mais simples que achei.