This article describes the method of Java to implement timing tasks based on thread pooling and reflection mechanism. Share it for your reference, as follows:
It mainly includes the following implementation classes:
1. Main class:
The entry to task execution:
Call the main method to start loading the task configuration and executing the task
package com.yanek.task; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; im port 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.S ECONDS); } } }2. The MyTask class implements the Runnable interface and calls it in the main class
package com.yanek.task; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Date; public class My Task 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.forN ame(taskModel .getClassName()); Method getMethod = classType.getMethod(taskModel.getMethodName()); getMethod.invoke(classType); } catch (SecurityE xception e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace (); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccess Exception e) { e.printStackTrace(); } catch (InvocationTargetException e) { e .printStackTrace(); } } }3. TaskModel: Encapsulation of task classes
package com.yanek.task; public class TaskModel { public String getClassName() { return className; } public void setClassName(String classNam e) { 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 i nitialDelay) { 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. XmlReader task configuration resolution class
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 = d oc.getRootElement(); List<Element> children = rootelement.getChildren(); for (int i = 0; i < children.size(); i++) { TaskModel tModel = new TaskModel(); tModel.setClassNa me(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 = children.get(i).getChildText("initialDelay"); tModel.setInitialD elay((Long.valueOf(initialDelay))); System .out.println("It's still bad to first run" + initialDelay + "seconds! "); 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-generator ed catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.out.println("file no exist!"); } System.out.println("lo ad task config end ! "); return tasks; } }5. Configuration file:
<?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</initial> </task> <task> <class>com.yanek.task.TaskC</class> <method>testC</method> <initialDelay>5</initialDelay> <period>3</period > </task> </taskconfig>
6. Test task class:
TaskA TaskB TaskC defines static methods, and the static methods of these classes are configured in the xml file and are called.
package com.yanek.task; public class TaskA { /** * @param args */ public static void main(String[] args) { System.out.println("task a test"); } p ublic static void testA( ) { System.out.println("taska testA method call!"); } } package com.yanek.task; public class TaskB { /** * @param args */ public static void ma in(String[] args) { System.out.println("task b test"); } public static void testB() { System.out.println("TaskB testB method call!"); } } package com.yanek.task; pu blic 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!"); } }I hope this article will be helpful to everyone's Java programming.