这篇文章主要介绍了java基于线程池和反射机制实现定时任务的方法,以完整实例形式较为详细的分析了Java定时任务的功能原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了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程序设计有所帮助。
新闻热点
疑难解答
图片精选