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