热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要介绍了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

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<&#63;> 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 

5. 配置文件:

<&#63;xml version="1.0" encoding="UTF-8"&#63;> 
 
   
    com.yanek.task.TaskA 
    testA 
    5 
    2 
   
   
    com.yanek.task.TaskB 
    testB 
    5 
    3 
   
   
    com.yanek.task.TaskC 
    testC 
    5 
    3 
   

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程序设计有所帮助。


推荐阅读
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了StartingzookeeperFAILEDTOSTART相关的知识,希望对你有一定的参考价值。下载路径:https://ar ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
author-avatar
mobiledu2502874455
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有