java基于线程池和反射机制实现定时任务完整实例
本文实例讲述了java基于线程池和反射机制实现定时任务的方法。分享给大家供大家参考,具体如下:
主要包括如下实现类:
1.Main类:
任务执行的入口:
调用main方法,开始加载任务配置并执行任务
packagecom.yanek.task;
importjava.util.List;
importjava.util.concurrent.Executors;
importjava.util.concurrent.ScheduledExecutorService;
importjava.util.concurrent.TimeUnit;
publicclassMain{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
ScheduledExecutorServicescheduExec=Executors.newScheduledThreadPool(1);
/*
TaskModeltm=newTaskModel();
tm.setClassName("com.yanek.task.TaskA");
tm.setMethodName("testA");
tm.setInitialDelay(3);
tm.setPeriod(5);
*/
Listtasks=XmlReader.getTasks();
for(inti=0;i<tasks.size();i++)
{
TaskModeltm=(TaskModel)tasks.get(i);
scheduExec.scheduleAtFixedRate(newMyTask(tm),tm.getInitialDelay(),tm.getPeriod(),TimeUnit.SECONDS);
}
}
}
2.MyTask类实现Runnable接口,在main类中调用
packagecom.yanek.task;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
importjava.util.Date;
publicclassMyTaskimplementsRunnable{
privateTaskModeltaskModel;
publicMyTask(){}
publicMyTask(TaskModeltm){
this.taskModel=tm;
}
publicvoidrun(){
System.out.println("callat"+(newDate()));
try{
Class<?>classType=Class.forName(taskModel.getClassName());
MethodgetMethod=classType.getMethod(taskModel.getMethodName());
getMethod.invoke(classType);
}catch(SecurityExceptione){
e.printStackTrace();
}catch(IllegalArgumentExceptione){
e.printStackTrace();
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(NoSuchMethodExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}catch(InvocationTargetExceptione){
e.printStackTrace();
}
}
}
3.TaskModel:对任务类的封装
packagecom.yanek.task;
publicclassTaskModel{
publicStringgetClassName(){
returnclassName;
}
publicvoidsetClassName(StringclassName){
this.className=className;
}
publicStringgetMethodName(){
returnmethodName;
}
publicvoidsetMethodName(StringmethodName){
this.methodName=methodName;
}
publiclonggetInitialDelay(){
returninitialDelay;
}
publicvoidsetInitialDelay(longinitialDelay){
this.initialDelay=initialDelay;
}
publiclonggetPeriod(){
returnperiod;
}
publicvoidsetPeriod(longperiod){
this.period=period;
}
privateStringclassName;
privateStringmethodName;
privatelonginitialDelay;
privatelongperiod;
}
4.XmlReader任务配置解析类
packagecom.yanek.task;
importjava.io.File;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.commons.lang.StringUtils;
importorg.jdom.Document;
importorg.jdom.Element;
importorg.jdom.JDOMException;
importorg.jdom.input.SAXBuilder;
publicclassXmlReader{
publicstaticvoidmain(String[]args){
XmlReader.getTasks();
}
publicstaticListgetTasks(){
Listtasks=newArrayList();
System.out.println("loadtaskconfigstart...");
Stringpath="/work/TaskManager/conf/taskconfig.xml";
Filefile=newFile(path);
if(file.exists()&&!file.isDirectory()){
try{
SAXBuildersx=newSAXBuilder();
Documentdoc=sx.build(file);
Elementrootelement=doc.getRootElement();
List<Element>childs=rootelement.getChildren();
for(inti=0;i<childs.size();i++){
TaskModeltModel=newTaskModel();
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"));
StringinitialDelay=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(NumberFormatExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(JDOMExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}else{
System.out.println("filenoexist!");
}
System.out.println("loadtaskconfigend!");
returntasks;
}
}
5.配置文件:
<?xmlversion="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.测试任务类:
TaskATaskBTaskC其中定义静态方法,这些类的静态方法配置在xml文件中,被调用。
packagecom.yanek.task;
publicclassTaskA{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
System.out.println("taskatest");
}
publicstaticvoidtestA()
{
System.out.println("taskatestAmethodcall!");
}
}
packagecom.yanek.task;
publicclassTaskB{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
System.out.println("taskbtest");
}
publicstaticvoidtestB()
{
System.out.println("TaskBtestBmethodcall!");
}
}
packagecom.yanek.task;
publicclassTaskC{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
System.out.println("taskctest");
}
publicstaticvoidtestC()
{
System.out.println("TaskctestCmethodcall!");
}
}
希望本文所述对大家Java程序设计有所帮助。