当前位置: 移动技术网 > IT编程>开发语言>Java > java基于线程池和反射机制实现定时任务完整实例

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

幸福恋人街为爱盖章,潘林风,洪荒龟仙人

本文实例讲述了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程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网