本文实例讲述了java基于线程池和反射机制实现定时任务的方法。分享给大家供大家参考,具体如下:
主要包括如下实现类:
1. Main类:
任务执行的入口:
调用main方法,开始加载任务配置并执行任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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类中调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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: 对任务类的封装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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 任务配置解析类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
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. 配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<? 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文件中,被调用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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程序设计有所帮助。