• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

java 搞代码 4年前 (2022-01-05) 22次浏览 已收录 0个评论

这篇文章主要介绍了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 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. 配置文件:

    com.yanek.task.TaskAtestA52 com.yanek.task.TaskBtestB53 com.yanek.task.TaskCtestC53

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 ar<b style="color:transparent">来源gao@!dai!ma.com搞$$代^@码!网</b>gs */ 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程序设计有所帮助。

以上就是java基于线程池和反射机制实现定时任务完整实例的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:java基于线程池和反射机制实现定时任务完整实例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址