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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

本文實例講述了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

{

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

com.yanek.task.TaskA

testA

5

2

com.yanek.task.TaskB

testB

5

3

com.yanek.task.TaskC

testC

5

3

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基于线程池和反射机制实现定时任务完整实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。