Maison >Java >javaDidacticiel >Un exemple complet de Java implémentant des tâches planifiées basées sur un pool de threads et un mécanisme de réflexion
L'exemple de cet article décrit comment Java implémente les tâches planifiées basées sur le pool de threads et le mécanisme de réflexion. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
comprend principalement les classes d'implémentation suivantes :
1. Classe principale :
Entrée pour l'exécution des tâches :
Appelez la méthode principale pour commencer à charger la configuration de la tâche et exécuter la tâche
package com.yanek.task; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class Main { /** * @param args */ public static void main(String[] args) { ScheduledExecutorService scheduExec = Executors.newScheduledThreadPool(1); /* TaskModel tm=new TaskModel(); tm.setClassName("com.yanek.task.TaskA"); tm.setMethodName("testA"); tm.setInitialDelay(3); tm.setPeriod(5); */ List tasks=XmlReader.getTasks(); for (int i=0;i<tasks.size();i++) { TaskModel tm=(TaskModel)tasks.get(i); scheduExec.scheduleAtFixedRate(new MyTask(tm),tm.getInitialDelay(), tm.getPeriod(), TimeUnit.SECONDS); } } }
2 La classe MyTask implémente l'interface Runnable et appelle
package com.yanek.task; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Date; public class MyTask implements Runnable { private TaskModel taskModel; public MyTask() {} public MyTask(TaskModel tm) { this.taskModel = tm; } public void run() { System.out.println("call at " + (new Date())); try { Class<?> classType = Class.forName(taskModel.getClassName()); Method getMethod = classType.getMethod(taskModel.getMethodName()); getMethod.invoke(classType); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
dans. la classe principale 3. TaskModel : pour la classe de tâches Encapsulation
package com.yanek.task; public class TaskModel { public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public long getInitialDelay() { return initialDelay; } public void setInitialDelay(long initialDelay) { this.initialDelay = initialDelay; } public long getPeriod() { return period; } public void setPeriod(long period) { this.period = period; } private String className; private String methodName; private long initialDelay; private long period; }
4. Classe d'analyse de configuration de tâche XmlReader
package com.yanek.task; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class XmlReader { public static void main(String[] args) { XmlReader.getTasks(); } public static List getTasks() { List tasks = new ArrayList(); System.out.println("load task config start..."); String path = "/work/TaskManager/conf/taskconfig.xml"; File file = new File(path); if (file.exists() && !file.isDirectory()) { try { SAXBuilder sx = new SAXBuilder(); Document doc = sx.build(file); Element rootelement = doc.getRootElement(); List<Element> childs = rootelement.getChildren(); for (int i = 0; i < childs.size(); i++) { TaskModel tModel = new TaskModel(); tModel.setClassName(childs.get(i).getChildText("class")); System.out.println(childs.get(i).getChildText("class")); tModel.setMethodName(childs.get(i).getChildText("method")); System.out.println(childs.get(i).getChildText("method")); String initialDelay = childs.get(i).getChildText("initialDelay"); tModel.setInitialDelay((Long.valueOf(initialDelay))); System.out.println("距离首次运行还差" + initialDelay + "秒!"); tModel.setPeriod(Integer.valueOf(childs.get(i).getChildText("period"))); System.out.println(childs.get(i).getChildText("period")); tasks.add(tModel); } } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JDOMException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.out.println("file no exist!"); } System.out.println("load task config end !"); return tasks; } }
5. Fichier de configuration :
<?xml version="1.0" encoding="UTF-8"?> <taskconfig> <task> <class>com.yanek.task.TaskA</class> <method>testA</method> <initialDelay>5</initialDelay> <period>2</period> </task> <task> <class>com.yanek.task.TaskB</class> <method>testB</method> <initialDelay>5</initialDelay> <period>3</period> </task> <task> <class>com.yanek.task.TaskC</class> <method>testC</method> <initialDelay>5</initialDelay> <period>3</period> </task> </taskconfig>6. Classe de tâches de test : TaskA TaskB TaskC définit les méthodes statiques de ces classes sont configurées dans des fichiers XML et sont appelées.
package com.yanek.task; public class TaskA { /** * @param args */ public static void main(String[] args) { System.out.println("task a test"); } public static void testA() { System.out.println("taska testA method call!"); } } package com.yanek.task; public class TaskB { /** * @param args */ public static void main(String[] args) { System.out.println("task b test"); } public static void testB() { System.out.println("TaskB testB method call!"); } } package com.yanek.task; public class TaskC { /** * @param args */ public static void main(String[] args) { System.out.println("task c test"); } public static void testC() { System.out.println("Taskc testC method call!"); } }J'espère que cet article sera utile à tout le monde dans la programmation Java. Pour plus d'exemples complets de tâches planifiées basées sur Java et basés sur des pools de threads et des mécanismes de réflexion, veuillez faire attention au site Web PHP chinois !