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!