本文实例讲述了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程序设计有所帮助。