本文实例讲述了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

{

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.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中定时任务和线程池_java基于线程池和反射机制实现定时任务完整实例相关推荐

  1. java中的递归函数调用函数_Java中函数的递归调用

    说到递归,java中的递归和C语言中也是很相似的,在Java中,递归其实就是利用了栈的先进后出的机制来描述的. public class HelloWorld { public static void ...

  2. java定时线程池_java 定时器线程池(ScheduledThreadPoolExecutor)的实现

    前言 定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行.但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通Thre ...

  3. java count 在哪一类里_java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用...

    先来讲解一下Semaphore信号灯的作用: 可以维护当前访问自身的线程个数,并提供了同步机制, 使用semaphore可以控制同时访问资源的线程个数 例如,实现一个文件允许的并发访问数. 请看下面的 ...

  4. java中怎么判断一段代码时线程安全还是非线程安全_Java 中的多线程你只要看这一篇就够了...

    引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...

  5. java 多线程池_Java ThreadPoolExecutor线程池 同时执行50个线程

    最近项目上有个需求,需要从FTP服务器中下载大批量的数据文件,然后解析该数据文件进行入库,数据库为oracle,最后在通过web工程,以报表和图表的形式进行展现. 这些批量的数据文件为纯文本文件,每天 ...

  6. java 异步线程池_Java - 异步线程池

    一.异步线程启动: new Thread newThread(newRunnable() { @Overridepublic voidrun() {//-- 这里是异步线程内的逻辑 } } ).sta ...

  7. java中executors_Java通过Executors提供四种线程池

    http://cuisuqiang.iteye.com/blog/2019372 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如 ...

  8. java中的STL库_C++11 STL线程库实现一个简单的线程池

    使用C++11 STL线程库实现一个线程池.处理机制是抢占式的,即所有线程从一个队列(std::queue)中获取任务执行(计算字符串简单HASH值),使用std::mutex和std::condit ...

  9. java多线程线程池_Java多线程——线程池(ThreadPool)

    我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁 ...

最新文章

  1. es6+最佳入门实践(10)
  2. 在ashx中使用Session
  3. 新闻上的文本分类:机器学习大乱斗 王岳王院长 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处
  4. BJUI实现每日数据汇总默认显示某天的数据
  5. 先判断对象是否为NULL再进行操作
  6. 2021 CCPC E. 被遗忘的计划(循环卷积+快速幂)
  7. U盘装XP系统(含截图,2012最新原创超简单方法)
  8. leetcode 8: 字符串转整数(atoi)
  9. linux下nand flash驱动工作原理,Linux驱动之Nand Flash四问,原理、工作方式都包含了...
  10. QML工作笔记-PC端和Android端布局错位问题
  11. 广东省计算机考试图片大小,广东省计算机等级考试(20190423051419).doc
  12. Asp.Net Core使用Log4Net优化日志【项目开源】
  13. java什么叫声明异常_java – 声明异常而不是处理它的重点是什么
  14. C#的变迁史 - C# 4.0 之线程安全集合篇
  15. Unity中Json文件编写注意
  16. IDEA将web项目打成war包
  17. iVX低代码平台系列制作APP简单的个人界面
  18. Pickit 3 Programmer使用说明及 烧写程序步骤
  19. 基于微信校园二手书交易小程序系统 毕业设计毕设参考
  20. python计算方位角_python如何计算方位角 python计算方位角代码实例

热门文章

  1. 8 .5 .5 创建操作员
  2. BZOJ4855 : [Jsoi2016]轻重路径
  3. Hibernate学习(三)
  4. we are the world 群星,
  5. 2009中国海上大阅兵全视频
  6. c#Struts框架理念和自制Struts框架下 复杂版
  7. FW : 一只小青蛙的一生(图片连载)
  8. BestCoder Round #85
  9. hdu 1418 抱歉 (欧拉公式)
  10. [POI2008] Poc (原名 Trians) Treap+Hash