Java, как написать таймер - PullRequest
3 голосов
/ 23 июня 2010

Я хотел написать таймер в java. который будет делать следующее: при запуске программы запустите timer1, который остановится через 45 минут, одновременно запустите второй таймер, который остановится через 15 минут.в это время первый таймер запустится снова и повторяет вышеуказанный цикл, пока программа не выйдет из первого таймера: 45 минут (время, которое я могу использовать компьютер), второй таймер: 15 минут (время паузы), первый таймер: 45 минут (времяЯ могу использовать компьютер) второй таймер: 15 минут (время паузы) первый таймер: 45 минут (время я могу использовать компьютер) второй таймер: 15 минут (время паузы)

Я не знаю, как использоватьпоток и таймер (utils, swing), поэтому я попытался использовать while (true), но процессор идет вверх.вот мой текущий код

static int getMinute(){
    Calendar cal=Calendar.getInstance();
    int minute=cal.getTime().getMinutes();
    return minute;
}

public static Runnable clockf(){
    if (endTime>=60){
        endTime=endTime-60;}
    System.out.println(startTime);
    System.out.println(currentTime);
    System.out.println(endTime);

    if(currentTime==endTime){
        pauseStart=getMinute();
        currentTime=getMinute();
        pauseEnd=pauseStart+15;

        if(currentTime==pauseEnd){
            pauseStart=0;
            pauseEnd=0;
            startTime=getMinute();
            currentTime=getMinute();
            endTime=startTime+45;
        }
    }
    else{
        update();
    }

    return null;

}

private static void update() {
    currentTime=getMinute();
    System.out.println(currentTime);
}

public static void main(String[] args) {
    startTime=getMinute();
    currentTime=getMinute();
    endTime=startTime+45;

    Thread t=new Thread(clockf());
    t.setDaemon(true);
    t.start();
    try {
        Thread.currentThread().sleep(1000);//60000

    } catch (InterruptedException e) {
        System.err.println(e);
    }



    }

но это не хорошо.Есть ли способ заставить метод clockf запускаться только один раз / мин?или любой другой способ заставить этот таймер работать?

Ответы [ 4 ]

5 голосов
/ 23 июня 2010

Самый быстрый код для написания и самый простой в обслуживании - это то, что вы вообще не пишете.

Я бы посмотрел на таймер и планировщик заданий, например, Кварц, чтобы посмотреть, поможет ли он вам.

5 голосов
/ 23 июня 2010

Хотя я не до конца понял, что вы пытаетесь сделать Таймер и TimerTask должны сделать это за вас. Следующий код должен быть немного улучшен, чтобы быть работоспособным, но, надеюсь, показывает принцип:

long minute = 1000*60;

Timer timer1 = new Timer();
long delay1 = 45*minute;
Timer timer2 = new Timer();
long delay2 = 15*minute;
TimerTask tt1;
TimerTask tt2;

...

tt1 = new TimerTask()
{
   public void run()
   {
      //do something and:
      timer2.schedule(tt2, delay2);
   }
};

tt2 = new TimerTask()
{
   public void run()
   {
      //do something and:
      timer1.schedule(tt1, delay1);
   }
};

timer1.schedule(tt1, delay1);
1 голос
/ 23 июня 2010

Есть некоторые серьезные проблемы в вашем коде и вашем понимании потоковых классов. Я предполагаю, что вы пытаетесь сделать, это определить Runnable, который вы передаете потоку. Однако на самом деле вы выполняете функцию clockf () как параметр конструктора Thread.

Если вам нужен таймер, посмотрите на класс Java-Timer: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Timer.html

Если вам нужно написать это самостоятельно, изучите класс Thread и особенности семантики сна и ожидания.

0 голосов
/ 23 июня 2010

я решаю проблему с таймером Теперь я могу пользоваться компьютером 45 минут, затем сделать паузу 15 минут. Большое спасибо за вашу помощь, и специально для kai1968 ^^ и этого сайта http://www.roseindia.net/java/example/java/util/CertainAndRepeatTime.shtml

а кто-нибудь может мне сказать, что значит статический? Я действительно не знаю, почему статика должна быть там.

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;


public class clock2 {
    static long minute = 1000*1;//60;
    static Timer timer1 = new Timer();
    static long delay1 = 60*minute;
    static Timer timer2 = new Timer();
    static long delay2 = 45*minute;
    static TimerTask tt1;
    static TimerTask tt2;
    static String s;

    static String getSecond(){
         Calendar calendar = new GregorianCalendar();
         int second = calendar.get(Calendar.SECOND);
         s=Integer.toString(second);
         return s;
    }

    public static void timer(){
        tt1=new TimerTask(){
            public void run(){
                getSecond();
                System.out.println(s+"Begin");
            }
        };

        tt2=new TimerTask(){
            public void run(){
                getSecond();
                System.err.println(s+"Stop");
            }
        };

        timer1.schedule(tt1 ,0,delay1);
        timer2.schedule(tt2 ,delay2,delay1);
        }




    public static void main(String[] args) {
        timer();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...