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

简介:

文章标题:java中基于线程池和反射机制实现定时任务

文章地址: http://blog.csdn.net/5iasp/article/details/10949925

作者: javaboy2012
Email:yanek@163.com
qq:    1046011462

 

 

 

直接上代码:

 

主要包括如下实现类:

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<tasks.size();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<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. 配置文件:

 

<?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>


5. 测试任务类:

 

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!");
		
	}

}


 

 

 

 

 

目录
相关文章
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
164 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
190 1
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
152 0
|
3月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
237 16
|
4月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
4月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
存储 安全 Java
解锁Java并发编程奥秘:深入剖析Synchronized关键字的同步机制与实现原理,让多线程安全如磐石般稳固!
【8月更文挑战第4天】Java并发编程中,Synchronized关键字是确保多线程环境下数据一致性与线程安全的基础机制。它可通过修饰实例方法、静态方法或代码块来控制对共享资源的独占访问。Synchronized基于Java对象头中的监视器锁实现,通过MonitorEnter/MonitorExit指令管理锁的获取与释放。示例展示了如何使用Synchronized修饰方法以实现线程间的同步,避免数据竞争。掌握其原理对编写高效安全的多线程程序极为关键。
260 1
|
安全 Java 开发者
Java并发编程中的线程安全问题及解决方案探讨
在Java编程中,特别是在并发编程领域,线程安全问题是开发过程中常见且关键的挑战。本文将深入探讨Java中的线程安全性,分析常见的线程安全问题,并介绍相应的解决方案,帮助开发者更好地理解和应对并发环境下的挑战。【7月更文挑战第3天】
327 0
|
安全 Java 开发者
Java并发编程中的线程安全策略
在现代软件开发中,Java语言的并发编程特性使得多线程应用成为可能。然而,随着线程数量的增加,如何确保数据的一致性和系统的稳定性成为开发者面临的挑战。本文将探讨Java并发编程中实现线程安全的几种策略,包括同步机制、volatile关键字的使用、以及java.util.concurrent包提供的工具类,旨在为Java开发者提供一系列实用的方法来应对并发问题。
155 0

热门文章

最新文章