首页 > 开发 > Java > 正文

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

2024-07-13 09:55:56
字体:
来源:转载
供稿:网友

这篇文章主要介绍了java基于线程池和反射机制实现定时任务的方法,以完整实例形式较为详细的分析了Java定时任务的功能原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

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

主要包括如下实现类:

1. Main类:

任务执行的入口:

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

 

 
  1. package com.yanek.task;  
  2. import java.util.List;  
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.ScheduledExecutorService;  
  5. import java.util.concurrent.TimeUnit;  
  6. public class Main {  
  7. /**  
  8. * @param args  
  9. */ 
  10. public static void main(String[] args) {  
  11. ScheduledExecutorService scheduExec = Executors.newScheduledThreadPool(1);  
  12. /*  
  13. TaskModel tm=new TaskModel();  
  14. tm.setClassName("com.yanek.task.TaskA");  
  15. tm.setMethodName("testA");  
  16. tm.setInitialDelay(3);  
  17. tm.setPeriod(5);  
  18. */ 
  19. List tasks=XmlReader.getTasks();  
  20. for (int i=0;i<tasks.size();i++)  
  21. {  
  22. TaskModel tm=(TaskModel)tasks.get(i);  
  23. scheduExec.scheduleAtFixedRate(new MyTask(tm),tm.getInitialDelay(), tm.getPeriod(), TimeUnit.SECONDS);  
  24. }  
  25. }  

2. MyTask 类 实现Runnable接口,在main类中调用

 

 
  1. package com.yanek.task;  
  2. import java.lang.reflect.InvocationTargetException;  
  3. import java.lang.reflect.Method;  
  4. import java.util.Date;  
  5. public class MyTask implements Runnable {  
  6. private TaskModel taskModel;  
  7. public MyTask() {}  
  8. public MyTask(TaskModel tm) {  
  9. this.taskModel = tm;  
  10. }  
  11. public void run() {  
  12. System.out.println("call at " + (new Date()));  
  13. try {  
  14. Class<?> classType = Class.forName(taskModel.getClassName());  
  15. Method getMethod = classType.getMethod(taskModel.getMethodName());  
  16. getMethod.invoke(classType);  
  17. catch (SecurityException e) {  
  18. e.printStackTrace();  
  19. catch (IllegalArgumentException e) {  
  20. e.printStackTrace();  
  21. catch (ClassNotFoundException e) {  
  22. e.printStackTrace();  
  23. catch (NoSuchMethodException e) {  
  24. e.printStackTrace();  
  25. catch (IllegalAccessException e) {  
  26. e.printStackTrace();  
  27. catch (InvocationTargetException e) {  
  28. e.printStackTrace();  
  29. }  
  30. }  

3. TaskModel: 对任务类的封装

 

 
  1. package com.yanek.task;  
  2. public class TaskModel {  
  3. public String getClassName() {  
  4. return className;  
  5. }  
  6. public void setClassName(String className) {  
  7. this.className = className;  
  8. }  
  9. public String getMethodName() {  
  10. return methodName;  
  11. }  
  12. public void setMethodName(String methodName) {  
  13. this.methodName = methodName;  
  14. }  
  15. public long getInitialDelay() {  
  16. return initialDelay;  
  17. }  
  18. public void setInitialDelay(long initialDelay) {  
  19. this.initialDelay = initialDelay;  
  20. }  
  21. public long getPeriod() {  
  22. return period;  
  23. }  
  24. public void setPeriod(long period) {  
  25. this.period = period;  
  26. }  
  27. private String className;  
  28. private String methodName;  
  29. private long initialDelay;  
  30. private long period;  

4. XmlReader 任务配置解析类

 

 
  1. package com.yanek.task;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import org.apache.commons.lang.StringUtils;  
  7. import org.jdom.Document;  
  8. import org.jdom.Element;  
  9. import org.jdom.JDOMException;  
  10. import org.jdom.input.SAXBuilder;  
  11. public class XmlReader {  
  12. public static void main(String[] args) {  
  13. XmlReader.getTasks();  
  14. }  
  15. public static List getTasks() {  
  16. List tasks = new ArrayList();  
  17. System.out.println("load task config start...");  
  18. String path = "/work/TaskManager/conf/taskconfig.xml";  
  19. File file = new File(path);  
  20. if (file.exists() && !file.isDirectory()) {  
  21. try {  
  22. SAXBuilder sx = new SAXBuilder();  
  23. Document doc = sx.build(file);  
  24. Element rootelement = doc.getRootElement();  
  25. List<Element> childs = rootelement.getChildren();  
  26. for (int i = 0; i < childs.size(); i++) {  
  27. TaskModel tModel = new TaskModel();  
  28. tModel.setClassName(childs.get(i).getChildText("class"));  
  29. System.out.println(childs.get(i).getChildText("class"));  
  30. tModel.setMethodName(childs.get(i).getChildText("method"));  
  31. System.out.println(childs.get(i).getChildText("method"));  
  32. String initialDelay = childs.get(i).getChildText("initialDelay");  
  33. tModel.setInitialDelay((Long.valueOf(initialDelay)));  
  34. System.out.println("距离首次运行还差" + initialDelay + "秒!");  
  35. tModel.setPeriod(Integer.valueOf(childs.get(i).getChildText("period")));  
  36. System.out.println(childs.get(i).getChildText("period"));  
  37. tasks.add(tModel);  
  38. }  
  39. catch (NumberFormatException e) {  
  40. // TODO Auto-generated catch block  
  41. e.printStackTrace();  
  42. catch (JDOMException e) {  
  43. // TODO Auto-generated catch block  
  44. e.printStackTrace();  
  45. catch (IOException e) {  
  46. // TODO Auto-generated catch block  
  47. e.printStackTrace();  
  48. }  
  49. else {  
  50. System.out.println("file no exist!");  
  51. }  
  52. System.out.println("load task config end !");  
  53. return tasks;  
  54. }  

5. 配置文件:

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <taskconfig>  
  3. <task>  
  4. <class>com.yanek.task.TaskA</class>  
  5. <method>testA</method>  
  6. <initialDelay>5</initialDelay>  
  7. <period>2</period>  
  8. </task>  
  9. <task>  
  10. <class>com.yanek.task.TaskB</class>  
  11. <method>testB</method>  
  12. <initialDelay>5</initialDelay>  
  13. <period>3</period>  
  14. </task>  
  15. <task>  
  16. <class>com.yanek.task.TaskC</class>  
  17. <method>testC</method>  
  18. <initialDelay>5</initialDelay>  
  19. <period>3</period>  
  20. </task>  
  21. </taskconfig> 

6. 测试任务类:

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

 

 
  1. package com.yanek.task;  
  2. public class TaskA {  
  3. /**  
  4. * @param args  
  5. */ 
  6. public static void main(String[] args) {  
  7. System.out.println("task a test");  
  8. }  
  9. public static void testA()  
  10. {  
  11. System.out.println("taska testA method call!");  
  12. }  
  13. }  
  14. package com.yanek.task;  
  15. public class TaskB {  
  16. /**  
  17. * @param args  
  18. */ 
  19. public static void main(String[] args) {  
  20. System.out.println("task b test");  
  21. }  
  22. public static void testB()  
  23. {  
  24. System.out.println("TaskB testB method call!");  
  25. }  
  26. }  
  27. package com.yanek.task;  
  28. public class TaskC {  
  29. /**  
  30. * @param args  
  31. */ 
  32. public static void main(String[] args) {  
  33. System.out.println("task c test");  
  34. }  
  35. public static void testC()  
  36. {  
  37. System.out.println("Taskc testC method call!");  
  38. }  

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

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