JAvaスレッドプールと反射メカニズムに基づいてタイミングタスクの完全なインスタンスを実現

7466 ワード

この例では、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 
 

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プログラムの設計に役立つことを望んでいます.