java基于线程池和反射机制实现定时任务完整实例
程序员文章站
2024-03-07 18:21:57
本文实例讲述了java基于线程池和反射机制实现定时任务的方法。分享给大家供大家参考,具体如下:
主要包括如下实现类:
1. main类:
任务执行的入口:
调用ma...
本文实例讲述了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<tasks.size();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<element> 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. 配置文件:
<?xml version="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. 测试任务类:
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 BASE64Encoder详细介绍及简单实例
下一篇: python数据分析-01