Java自帶的java.util.Timer類,這個類允許你調度一個java.util.TimerTask任務。
使用這種方式可以讓你的程序按照某一個頻度執行,但不能在指定時間運行。一般用的較少
監聽器類:
package com.tech.jin.listener; import java.util.Timer; import java.util.TimerTask; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.log4j.Logger; import org.springframework.web.context.support.WebApplicationContextUtils; import com.tech.jin.task.OneTask; import com.tech.jin.util.Const; /** * 任務監聽器 需要配置在web.xml的listener中 * @author Administrator * */ public class TaskListener implements ServletContextListener{ private Logger logger = Logger.getLogger(TaskListener.class); private ServletContext context = null; private Timer timer = null; @Override public void contextDestroyed(ServletContextEvent event) { logger.info("TaskListener contextDestroyed..."); timer.cancel(); context = null; } @Override public void contextInitialized(ServletContextEvent event) { logger.info("TaskListener contextInitialized..."); context = event.getServletContext(); //如果使用spring框架,可將context放入到一個工具類中的常量,用來取到WebApplicationContext // Const.WEB_APP_CONTEXT = WebApplicationContextUtils.getWebApplicationContext(context); logger.info("定時器開始初始化..."); timer = new Timer(); logger.info("定時任務OneTask創建..."); TimerTask task = new OneTask(context); long period = 60*60*1000;//每隔1小時 timer.schedule(task, 0, period); logger.info("定時任務OneTask已添加到任務調度..."); //TODO } }
任務類:
package com.tech.jin.task; import java.util.Calendar; import java.util.TimerTask; import javax.servlet.ServletContext; import org.apache.log4j.Logger; public class OneTask extends TimerTask{ private Logger logger = Logger.getLogger(OneTask.class); private ServletContext context = null; private static final int taskExcuteTime = 15;//15點鍾 public OneTask(ServletContext context){ this.context = context; } @Override public void run() { logger.info("OneTask run..."); Calendar c = Calendar.getInstance(); int currentHour = c.get(Calendar.HOUR_OF_DAY);//24小時制,取值0-24 if(currentHour==taskExcuteTime){ logger.info("任務開始..."); try { doTask();//執行任務邏輯 } catch (Exception e) { logger.error("任務執行異常:"+e); } logger.info("任務結束..."); } } public void doTask() throws InterruptedException{ logger.info("doTask"); logger.info("context:"+context); } }
另一種是相比於Timer的單線程,它是通過線程池的方式來執行任務的。
package com.tech.jin.listener; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.log4j.Logger; import com.tech.jin.task.OneTask; /** * 任務監聽器 需要配置在web.xml的listener中 * @author Administrator * */ public class TaskListener implements ServletContextListener{ private Logger logger = Logger.getLogger(TaskListener.class); private ServletContext context = null; private Timer timer = null; @Override public void contextDestroyed(ServletContextEvent event) { logger.info("TaskListener contextDestroyed..."); timer.cancel(); context = null; } @Override public void contextInitialized(ServletContextEvent event) { logger.info("TaskListener contextInitialized..."); context = event.getServletContext(); //如果使用spring框架,可將context放入到一個工具類中的常量,用來取到WebApplicationContext // Const.WEB_APP_CONTEXT = WebApplicationContextUtils.getWebApplicationContext(context); //1.定時任務實現方式一 /* logger.info("定時器開始初始化..."); timer = new Timer(); logger.info("定時任務OneTask創建..."); TimerTask task = new OneTask(context); long period = 60*60*1000;//每隔1小時 timer.schedule(task, 0, period); logger.info("定時任務OneTask已添加到任務調度...");*/ //2.定時任務實現方式二 相比於Timer的單線程,它是通過線程池的方式來執行任務的 Runnable r = new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }; long initialDelay = 0;//創建對象馬上執行 long period = 1;//間隔一秒 ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); service.scheduleAtFixedRate(r, initialDelay, period, TimeUnit.SECONDS); } }