java基于線程池和反射機(jī)制實(shí)現(xiàn)定時(shí)任務(wù)完整實(shí)例
本文實(shí)例講述了java基于線程池和反射機(jī)制實(shí)現(xiàn)定時(shí)任務(wù)的方法。分享給大家供大家參考,具體如下:
主要包括如下實(shí)現(xiàn)類:
1. Main類:
任務(wù)執(zhí)行的入口:
調(diào)用main方法,開始加載任務(wù)配置并執(zhí)行任務(wù)
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 類 實(shí)現(xiàn)Runnable接口,在main類中調(diào)用
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: 對(duì)任務(wù)類的封裝
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 任務(wù)配置解析類
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("距離首次運(yùn)行還差" + 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. 測試任務(wù)類:
TaskA TaskB TaskC其中定義靜態(tài)方法 ,這些類的靜態(tài)方法配置在 xml文件中,被調(diào)用。
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!");
}
}
希望本文所述對(duì)大家Java程序設(shè)計(jì)有所幫助。
相關(guān)文章
springcloud 熔斷監(jiān)控Hystrix Dashboard和Turbine
這篇文章主要介紹了springcloud 熔斷監(jiān)控Hystrix Dashboard和Turbine,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Java mysql數(shù)據(jù)庫并進(jìn)行內(nèi)容查詢實(shí)例代碼
這篇文章主要介紹了Java mysql數(shù)據(jù)庫并進(jìn)行內(nèi)容查詢實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11
Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼
這篇文章主要介紹了Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
Springboot中用 Netty 開啟UDP服務(wù)方式
這篇文章主要介紹了Springboot中用 Netty 開啟UDP服務(wù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringBoot整合Jasypt實(shí)現(xiàn)配置加密的步驟詳解
Jasypt是一個(gè)Java庫,提供了一種簡單的加密解密方式,可用于保護(hù)敏感數(shù)據(jù),例如密碼、API密鑰和數(shù)據(jù)庫連接信息等,本文給大家介紹了SpringBoot整合Jasypt實(shí)現(xiàn)配置加密的詳細(xì)步驟,感興趣的同學(xué)可以參考一下2023-11-11
Java項(xiàng)目打包發(fā)布到maven私倉常見的幾種方式
這篇文章主要介紹了項(xiàng)目打包發(fā)布到maven私倉常見的幾種方式,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03
Java基礎(chǔ)知識(shí)之CharArrayReader流的使用
這篇文章主要介紹了Java基礎(chǔ)知識(shí)之CharArrayReader流的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

