Comment utiliser la classe Timer pour appeler une méthode, faire quelque chose, réinitialiser la minuterie, répéter?


Je suis un débutant Java et j'ai été en train de trouver diverses solutions à ce problème et je me suis un peu noué. J'ai essayé avec des Threads, puis j'ai découvert cette classe de minuterie et je me suis amusé avec elle sans succès jusqu'à présent. Si vous pouviez poster du code exécutable avec une méthode principale pour que je puisse le voir fonctionner et commencer à jouer à partir de là, ce serait génial.

  1. Programme de lancement
  2. appel doSomething()
  3. Générer un nombre aléatoire et définir Minuteur pour aussi longtemps.
  4. Lorsque la minuterie s'éteint, appelez à nouveau doSomething().

Probablement en utilisant ceci: http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

Author: zb226, 2012-02-23

6 answers

Si vous voulez simplement utiliser la minuterie, je ferais quelque chose comme ceci:

public class TestClass {
    public long myLong = 1234;

    public static void main(String[] args) {
        final TestClass test = new TestClass();

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                test.doStuff();
            }
        }, 0, test.myLong);
    }

    public void doStuff(){
        //do stuff here
    }
}

Désolé pour l'identation moche.

De plus, si vous avez besoin de planifier l'exécution du code, jetez un œil à Guava Services car cela peut vraiment rendre votre code beaucoup plus clair et abstrait un peu du passe-partout de la création de threads, de la planification, etc.

En passant, je n'ai pas pris la peine de générer un nombre aléatoire, etc., mais je pense que vous pouvez comprendre comment inclure cette partie. J'espère c'est assez pour vous obtenir sur la bonne voie.

Pour mémoire, si vous deviez utiliser de la goyave, cela ressemblerait à ceci:

class CrawlingService extends AbstractScheduledService {

    @Override
    protected void runOneIteration() throws Exception {
        //run this alot
    }

    @Override
    protected void startUp() throws Exception {
        //anything you need to step up
    }

    @Override
    protected void shutDown() throws Exception {
        //anything you need to tear down
    }


    @Override
    protected Scheduler scheduler() {
        return new CustomScheduler() {
            @Override
            protected Schedule getNextSchedule() throws Exception {
                long a = 1000; //number you can randomize to your heart's content
                return new Schedule(a, TimeUnit.MILLISECONDS);
            }
        };
    }
}

Et vous créeriez simplement un principal appelé new CrawlingService.start(); c'est tout.

 38
Author: pcalcao, 2018-01-05 15:10:27

Voulez-vous spécifiquement un Timer? Sinon, vous êtes probablement mieux avec un ScheduledExecutorService et en appelant scheduleAtFixedRate ou scheduleWithFixedDelay; en citant le Javadocs:

Java 5.0 a introduit le paquet java.util.concurrent et l'un des les utilitaires de concurrence y sont le ScheduledThreadPoolExecutor qui est un pool de threads pour l'exécution répétée de tâches à un rythme donné ou retard. C'est effectivement un remplacement plus souple pour le Timer/TimerTask combinaison, car elle permet plusieurs services threads, accepte différentes unités de temps et ne nécessite pas de sous-classement TimerTask (il suffit d'implémenter Runnable). Configuration de ScheduledThreadPoolExecutor avec un thread, cela équivaut à Timer.

Mise à JOUR

Voici un code de travail utilisant un ScheduledExecutorService:

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test {
    public static void main(String[] args) {
        final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
        ses.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.println(new Date());
            }
        }, 0, 1, TimeUnit.SECONDS);
    }
}

La sortie ressemble à:

Thu Feb 23 21:20:02 HKT 2012
Thu Feb 23 21:20:03 HKT 2012
Thu Feb 23 21:20:04 HKT 2012
Thu Feb 23 21:20:05 HKT 2012
Thu Feb 23 21:20:06 HKT 2012
Thu Feb 23 21:20:07 HKT 2012
 23
Author: SimonC, 2017-04-11 11:34:36

Pensez à un scénario où je veux que mon code s'exécute à un moment donné dans mon application ou quelque temps plus tard à partir de l'heure actuelle. En d'autres termes, je veux planifier ma tâche à l'heure définie.

Java Timer classe (java.util.Timer) permet à une application de planifier la tâche sur un thread d'arrière-plan séparé.

Voici l'exemple le plus simple de Java Timer :

import java.util.Timer;
import java.util.TimerTask;
public class JavaTimer {
  public static void main(String[] args){
  Timer timer = new Timer();
  TimerTask task = new TimerTask() {
      @Override
   public void run() {
    System.out.println("Inside Timer Task" + System.currentTimeMillis());
       }
  };

  System.out.println("Current time" + System.currentTimeMillis());
  timer.schedule(task, 10000,1000);
  System.out.println("Current time" + System.currentTimeMillis());

  }
}

Output:
Current time1455469505220
Current time1455469505221
Inside Timer Task1455469515222
Inside Timer Task1455469516222
Inside Timer Task1455469517222
Inside Timer Task1455469518222
Inside Timer Task1455469519222
Inside Timer Task1455469520222
Inside Timer Task1455469521222
Inside Timer Task1455469522222
Inside Timer Task1455469523222
Inside Timer Task1455469524222
Inside Timer Task1455469525222
Inside Timer Task1455469526222
Inside Timer Task1455469527222
Inside Timer Task1455469528223
Inside Timer Task1455469529223 and it goes on

ANALYSE : L'appel à la minuterie.le calendrier (tâche, 10000,1000) est va planifier la tâche qui va s'exécuter pour la première fois (sur un autre thread) après 10 secondes de cet appel. Après cela, il appellera à nouveau après un délai de 10 secondes. Il est important de mentionner ici que si la tâche ne peut pas être démarrée après 10 secondes, le prochain appel de tâche ne sera pas pré-pond. Donc, ici, le temps de retard entre deux tâches consécutives est fixé.

Source: Exemple de temporisateur Java

 2
Author: Java Guru, 2016-04-05 04:29:23

Cette page a un bon exemple de l'utilisation de Timers et TimerTasks que vous pouvez ajuster à vos besoins.

 0
Author: Alexander Pavlov, 2014-04-17 09:42:23

Si vous ne voulez pas utiliser la classe timer et que vous pouvez utiliser Quartz, effectuez-le comme. Ma classe principale serait

import com.google.common.util.concurrent.AbstractScheduledService;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.TriggerBuilder.newTrigger;

import java.util.concurrent.CountDownLatch;

public class Test {


    public static void main(String[] args) throws Exception{


        CountDownLatch latch = new CountDownLatch(1);


        //do schdeuling thing
        JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity(
                "CronQuartzJob", "Group").build();

        // Create a Trigger that fires every 5 minutes.
        Trigger trigger = newTrigger()
                .withIdentity("TriggerName", "Group")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?"))
                .build();

        // Setup the Job and Trigger with Scheduler & schedule jobs
        final Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);

        //
        latch.await();

        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    scheduler.shutdown();
                    latch.countDown();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }));

    }






}

Et la classe de travail serait

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SimpleJob implements Job {


    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("executing task!");
    }


}

Je créerais un pot exécutable pour cela et je commencerais cela en utilisant java -jar .. & et Ctrl+C peut arrêter ce processus, Si vous le voulez en arrière-plan disown it

 0
Author: Dhruv Pal, 2017-03-28 08:06:48

Le code ci-dessous s'exécutera à 18h20 et il se répétera dans un intervalle de 5 secondes.

public static void main(String[] args) {
    Timer timer = new Timer();
    TimerTask tt = new TimerTask() {
        public void run() {
            Calendar cal = Calendar.getInstance();

            int hour = cal.get(Calendar.HOUR_OF_DAY);
            int min = cal.get(Calendar.MINUTE);
            if (hour == 18 && min == 20) {
                doSomething();
            }
        }
    };
    timer.schedule(tt, 1000, 5000);
}
 0
Author: deepesh kumar, 2018-05-24 12:56:48