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
{
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基于线程池和反射机制实现定时任务完整实例相关推荐
- java中的递归函数调用函数_Java中函数的递归调用
说到递归,java中的递归和C语言中也是很相似的,在Java中,递归其实就是利用了栈的先进后出的机制来描述的. public class HelloWorld { public static void ...
- java定时线程池_java 定时器线程池(ScheduledThreadPoolExecutor)的实现
前言 定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行.但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通Thre ...
- java count 在哪一类里_java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用...
先来讲解一下Semaphore信号灯的作用: 可以维护当前访问自身的线程个数,并提供了同步机制, 使用semaphore可以控制同时访问资源的线程个数 例如,实现一个文件允许的并发访问数. 请看下面的 ...
- java中怎么判断一段代码时线程安全还是非线程安全_Java 中的多线程你只要看这一篇就够了...
引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...
- java 多线程池_Java ThreadPoolExecutor线程池 同时执行50个线程
最近项目上有个需求,需要从FTP服务器中下载大批量的数据文件,然后解析该数据文件进行入库,数据库为oracle,最后在通过web工程,以报表和图表的形式进行展现. 这些批量的数据文件为纯文本文件,每天 ...
- java 异步线程池_Java - 异步线程池
一.异步线程启动: new Thread newThread(newRunnable() { @Overridepublic voidrun() {//-- 这里是异步线程内的逻辑 } } ).sta ...
- java中executors_Java通过Executors提供四种线程池
http://cuisuqiang.iteye.com/blog/2019372 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如 ...
- java中的STL库_C++11 STL线程库实现一个简单的线程池
使用C++11 STL线程库实现一个线程池.处理机制是抢占式的,即所有线程从一个队列(std::queue)中获取任务执行(计算字符串简单HASH值),使用std::mutex和std::condit ...
- java多线程线程池_Java多线程——线程池(ThreadPool)
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁 ...
最新文章
- es6+最佳入门实践(10)
- 在ashx中使用Session
- 新闻上的文本分类:机器学习大乱斗 王岳王院长 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处
- BJUI实现每日数据汇总默认显示某天的数据
- 先判断对象是否为NULL再进行操作
- 2021 CCPC E. 被遗忘的计划(循环卷积+快速幂)
- U盘装XP系统(含截图,2012最新原创超简单方法)
- leetcode 8: 字符串转整数(atoi)
- linux下nand flash驱动工作原理,Linux驱动之Nand Flash四问,原理、工作方式都包含了...
- QML工作笔记-PC端和Android端布局错位问题
- 广东省计算机考试图片大小,广东省计算机等级考试(20190423051419).doc
- Asp.Net Core使用Log4Net优化日志【项目开源】
- java什么叫声明异常_java – 声明异常而不是处理它的重点是什么
- C#的变迁史 - C# 4.0 之线程安全集合篇
- Unity中Json文件编写注意
- IDEA将web项目打成war包
- iVX低代码平台系列制作APP简单的个人界面
- Pickit 3 Programmer使用说明及 烧写程序步骤
- 基于微信校园二手书交易小程序系统 毕业设计毕设参考
- python计算方位角_python如何计算方位角 python计算方位角代码实例