欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-07 18:21:57
本文实例讲述了java基于线程池和反射机制实现定时任务的方法。分享给大家供大家参考,具体如下: 主要包括如下实现类: 1. main类: 任务执行的入口: 调用ma...

本文实例讲述了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<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>

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程序设计有所帮助。