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

网友投稿 262 2023-07-27


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.InvocationTargetExcNKtVCQDFeption;

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

{

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.InvocationTargetExcNKtVCQDFeption;

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:从JVM分析Java的类的加载和卸载机制
下一篇:java实现图片裁切的工具类实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~