首页 > 编程 > Java > 正文

java基于线程池和反射机制实现定时任务完整实例

2019-11-26 14:53:16
字体:
来源:转载
供稿:网友

本文实例讲述了java基于线程池和反射机制实现定时任务的方法。分享给大家供大家参考,具体如下:

主要包括如下实现类:

1. Main类:

任务执行的入口:

调用main方法,开始加载任务配置并执行任务

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. MyTask 类 实现Runnable接口,在main类中调用

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();    }  } }

3. TaskModel: 对任务类的封装

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. 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. 配置文件:

<?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. 测试任务类:

TaskA TaskB TaskC其中定义静态方法 ,这些类的静态方法配置在 xml文件中,被调用。

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!");  } } 

希望本文所述对大家Java程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表