日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java中定时任务和线程池_java基于线程池和反射机制实现定时任务完整实例

發(fā)布時(shí)間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中定时任务和线程池_java基于线程池和反射机制实现定时任务完整实例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文實(shí)例講述了java基于線程池和反射機(jī)制實(shí)現(xiàn)定時(shí)任務(wù)的方法。分享給大家供大家參考,具體如下:

主要包括如下實(shí)現(xiàn)類:

1. Main類:

任務(wù)執(zhí)行的入口:

調(diào)用main方法,開(kāi)始加載任務(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

{

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 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. 配置文件:

com.yanek.task.TaskA

testA

5

2

com.yanek.task.TaskB

testB

5

3

com.yanek.task.TaskC

testC

5

3

6. 測(cè)試任務(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!");

}

}

總結(jié)

以上是生活随笔為你收集整理的java中定时任务和线程池_java基于线程池和反射机制实现定时任务完整实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。