Maison >Java >JavaBase >Comment exécuter des tâches régulièrement en Java

Comment exécuter des tâches régulièrement en Java

angryTom
angryTomoriginal
2019-11-14 16:41:365135parcourir

Comment exécuter des tâches régulièrement en Java

Comment Java exécute-t-il régulièrement une méthode

Créer un fil de discussion.

import java.util.Date;
public class ThreadTest {
    public static void main(String[] args) {
        // 设置执行周期
        final long timeInterval = 3000;
        
        Runnable runnable = new Runnable() {
            public void run() {
                while (true) {
                    System.out.println("Task Run ... " + new Date());
                    
                    try {
                        Thread.sleep(timeInterval);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
    }
}
2. Utilisez l'API Timer et TaskTimer fournis avec JDK.

Quelle est la différence entre cette méthode et la première méthode simple et grossière ? Elle se reflète principalement dans le fait qu'en utilisant l'API, vous pouvez démarrer la tâche à une heure précise, et vous pouvez la reporter l'exécution de la première tâche. Vous pouvez également définir un certain intervalle de temps, mais le principe est le même. Un thread est toujours démarré en arrière-plan. Il faut dire qu'un seul thread exécute la tâche, quelle que soit la manière. de nombreuses tâches que nous commençons. Il y aura donc des problèmes. Par exemple, si une tâche n'est pas terminée et qu'une autre tâche commence à être exécutée, des problèmes de concurrence peuvent survenir. De plus, si une erreur est signalée dans une tâche, le thread sera arrêté.

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MyTask extends TimerTask{

    private String name;
    
    public MyTask(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = sf.format(new Date());
        System.out.println("exec MyTask ... 当前时间为:" + format);
        System.out.println(this.name +" 正在执行!" + sf.format(new Date()));
    }
    
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task1 = new MyTask("Tasks 1");
        TimerTask task2 = new MyTask("Tasks 2");
        
        Calendar calendar1 = Calendar.getInstance();
        calendar1.add(Calendar.SECOND, 3);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.add(Calendar.SECOND, 5);
        
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = sf.format(new Date());
        System.out.println("当前时间为:" + format);
        
        timer.schedule(task1, calendar1.getTime(), 3000L);
        timer.schedule(task2, calendar2.getTime(), 3000L);
    }

}

En fait, Timer encapsule une file d'attente de tâches et un objet thread Time. La référence de notre tâche personnalisée sera placée dans la file d'attente en attente d'exécution.

C'est à peu près comme cette relation : Timer - TimerThread - TaskQueue - MyTask - run Bien sûr, la méthode d'exécution finale doit être la méthode d'exécution dans notre tâche personnalisée. Parce que notre tâche personnalisée a hérité de TimeTask et que cette classe a implémenté l'interface Runnable.

3. Utiliser ScheduledExecutorService

ScheduledExecutorService a été introduit en tant que classe d'outils simultanés, qui constitue le moyen le plus idéal pour implémenter des tâches planifiées.

1. Par rapport au thread unique de Timer, il exécute des tâches via un pool de threads.

2. Vous pouvez définir de manière flexible le délai pour la première exécution de la tâche.

3. Fournit une bonne convention pour définir l'intervalle d'exécution.

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class qwe {
    public static void main(String[] args) {
        //新建定时任务
        Runnable runnable = new Runnable() {
            //run方法中是定时执行的操作
            public void run() {
                System.out.println(new Date());
            }
        };
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        /*
         * 参数一:command:执行线程
         * 参数二:initialDelay:初始化延时
         * 参数三:period:两次开始执行最小间隔时间
         * 参数四:unit:计时单位
         */
        service.scheduleAtFixedRate(runnable, 0, 60, TimeUnit.SECONDS);
    }
}

site Web chinois php, un grand nombre de

tutoriels d'introduction à Java

gratuits, bienvenue pour apprendre en ligne !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Comment empaqueter JavaArticle suivant:Comment empaqueter Java