ScheduledExecutorService
作者:赵磊
博客:http://elf8848.iteye.com
java.util.concurrent.Executors可创建一个线程池,它可给定延迟后定期地执行任务。
Executors.newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
其中的scheduleAtFixedRate 和 scheduleWithFixedDelay 方法可以创建并执行任务,这些任务一直执行 ,并且是可以取消的任务。
import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.logging.SimpleFormatter; /** * ScheduledExecutorService 测试 * * @author zhaolei 2012-5-23 */ public class ScheduledThreadPoolTest { private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); static SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd dd:mm:ss"); /** * beepForTime */ public static void beepForTime() { /** * 要执行的任务 */ final Runnable beeper = new Runnable() { int i=0; public void run() { System.out.println("beep:"+(i++)+"----"+sf.format(new Date(System.currentTimeMillis()))); //throw new RuntimeException(); //任务耗时2秒 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }; int startTime=3; int each=5; System.out.println("任务将于"+startTime+"秒后开始,每"+each+"秒执行1次"); /** * 每each秒执行一次任务,两次任务的执行间隔是each秒(前面定义的变更) * * * 创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期; * 也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行, * 接着在 initialDelay + 2 * period 后执行,依此类推。如果任务的任何一个执行遇到异常, * 则后续执行都会被取消。否则,只能通过执行程序的取消或终止方法来终止该任务。 * 如果此任务的任何一个执行要花费比其周期更长的时间,则将推迟后续执行,但不会同时执行。 * 参数: * command - 要执行的任务 * initialDelay - 首次执行的延迟时间 * period - 连续执行之间的周期 * unit - initialDelay 和 period 参数的时间单位 * */ //final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, startTime, each, TimeUnit.SECONDS); /** * * 每each秒执行一次任务,两次任务的执行间隔是each秒(前面定义的变更)+任务执行用时 * * 创建并执行一个在给定初始延迟后首次启用的定期操作, * 随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。 * 如果任务的任一执行遇到异常,就会取消后续执行。 * 否则,只能通过执行程序的取消或终止方法来终止该任务。 * 参数: * command - 要执行的任务 * initialDelay - 首次执行的延迟时间 * period - 连续执行之间的周期 * unit - initialDelay 和 period 参数的时间单位 * */ final ScheduledFuture<?> beeperHandle = scheduler.scheduleWithFixedDelay(beeper, startTime, each, TimeUnit.SECONDS); /** * 创建并执行在给定延迟后启用的一次性操作。 * * 这里用于在N时间后取消任务 */ scheduler.schedule(new Runnable() { public void run() { System.out.println("取消任务"); beeperHandle.cancel(true); } }, 60, TimeUnit.SECONDS); } /** * main * * @param args */ public static void main(String[] args) { beepForTime(); } }