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

 更新时间:2015年11月03日 12:44:27   作者:5iasp  
这篇文章主要介绍了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程序设计有所帮助。

相关文章

  • 用Java轻松读取Word文档内容的常用方法

    用Java轻松读取Word文档内容的常用方法

    这篇文章主要介绍了用Java轻松读取Word文档内容的常用方法,对于doc格式使用Apache POI库中的HWPFDocument和WordExtractor类,对于docx格式使用XWPFDocument类,并通过遍历段落和文本运行对象来提取文本内容,需要的朋友可以参考下
    2025-03-03
  • Spring boot实现应用打包部署的示例

    Spring boot实现应用打包部署的示例

    本篇文章主要介绍了Spring boot实现应用打包部署的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Java泛型在集合使用与自定义及继承上的体现和通配符的使用

    Java泛型在集合使用与自定义及继承上的体现和通配符的使用

    泛型又称参数化类型,是Jdk5.0 出现的新特性,解决数据类型的安全性问题,在类声明或实例化时只要指定好需要的具体的类型即可。Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮
    2021-09-09
  • java用list集合存储学生信息并算出成绩平均值操作

    java用list集合存储学生信息并算出成绩平均值操作

    这篇文章主要介绍了java用list集合存储学生信息并算出成绩平均值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Springboot-Shiro基本使用详情介绍

    Springboot-Shiro基本使用详情介绍

    这篇文章主要介绍了Springboot-Shiro基本使用详情,文章根据官网依据官网快速搭建Quickstart,配置pom.xml依赖等操作,需要的小伙伴可以参考下面文章内容
    2022-01-01
  • J2SE基础之下载eclipse并创建项目

    J2SE基础之下载eclipse并创建项目

    本文给大家介绍的是最流行的java 集成开发环境IDE eclipse的使用方法,非常的简单,有需要的小伙伴可以参考下
    2016-05-05
  • SpringBoot接入支付宝支付的方法步骤

    SpringBoot接入支付宝支付的方法步骤

    这篇文章主要介绍了SpringBoot接入支付宝支付的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 10张图总结出并发编程最佳学习路线

    10张图总结出并发编程最佳学习路线

    这篇文章主要介绍了并发编程的最佳学习路线,文中通过图片介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • SpringMVC中controller接收json数据的方法

    SpringMVC中controller接收json数据的方法

    这篇文章主要为大家详细介绍了SpringMVC中controller接收json数据的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Java中垃圾回收器GC对吞吐量的影响测试

    Java中垃圾回收器GC对吞吐量的影响测试

    这篇文章主要介绍了Java中垃圾回收器GC对吞吐量的影响测试,本文算是一个对垃圾回收器GC的优化文章,需要的朋友可以参考下
    2014-09-09

最新评论