Java并发编程--ExecutorService和ScheduledExecutorService
相关资料:
ScheduledExecutorService定时周期执行指定的任务:
http://blog.csdn.net/tsyj810883979/article/details/8481621
ExecutorService线程池:
http://blog.sina.com.cn/s/blog_6151984a0100krj8.html
ScheduledExecutorService(示例,出错代码):
http://www.apihome.cn/api/java/ScheduledExecutorService.html
ScheduledExecutorService:执行周期性任务、定时执行任务。
方法摘要:
schedule
ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
创建并执行在给定延迟后启用的 ScheduledFuture。
参数:command
- 要执行的任务delay
- 从现在开始延迟执行的时间unit
- 延迟参数的时间单位
返回:表示挂起任务完成的 ScheduledFuture,并且其 get() 方法在完成后将返回 null
---------------------
schedule
<V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
创建并执行在给定延迟后启用的一次性操作。
参数:callable
- 要执行的功能delay
- 从现在开始延迟执行的时间unit
- 延迟参数的时间单位
返回:可用于提取结果或取消的 ScheduledFuture
---------------------
scheduleAtFixedRate
ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。
参数:command
- 要执行的任务initialDelay
- 首次执行的延迟时间period
- 连续执行之间的周期unit
- initialDelay 和 period 参数的时间单位
返回:表示挂起任务完成的 ScheduledFuture,并且其 get() 方法在取消后将抛出异常
---------------------
scheduleWithFixedDelay
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。
参数:command
- 要执行的任务initialDelay
- 首次执行的延迟时间delay
- 一次执行终止和下一次执行开始之间的延迟unit
- initialDelay 和 delay 参数的时间单位
返回:表示挂起任务完成的 ScheduledFuture,并且其 get() 方法在取消后将抛出异常
---------------------
示例代码:
public class MyScheduled { public static void main(String args[]){ executeFixedRate(); } /** *1.按指定频率周期执行某个任务。 *初始化延迟0ms开始执行,每隔100ms重新执行一次任务。 * */ public static void executeFixedRate() { //ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); executor.scheduleAtFixedRate( new EchoServer(), 0, 100, TimeUnit.MILLISECONDS); } /** * 2.按指定频率间隔执行某个任务。 * 初始化时延时0ms开始执行,本次执行结束后延迟100ms开始下次执行。 * 注意与1的区别 */ public static void executeFixedDelay() { ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); executor.scheduleWithFixedDelay( new EchoServer(), 0, 100, TimeUnit.MILLISECONDS); } /** * 3.周期定时执行某个任务。 * 每天晚上8点执行一次 * 每天定时安排任务进行执行 */ public static void executeEightAtNightPerDay() { ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); long oneDay = 24 * 60 * 60 * 1000; long initDelay = getTimeMillis("20:00:00") - System.currentTimeMillis(); initDelay = initDelay > 0 ? initDelay : oneDay + initDelay; executor.scheduleAtFixedRate( new EchoServer(), initDelay, oneDay, TimeUnit.MILLISECONDS); } //辅助函数,获取指定时间对应的毫秒数 private static long getTimeMillis(String time) { try { DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd"); Date curDate = dateFormat.parse(dayFormat.format(new Date()) + " " + time); return curDate.getTime(); } catch (ParseException e) { e.printStackTrace(); } return 0; } } class EchoServer implements Runnable { @Override public void run() { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" This is a echo server. The current time is " + System.currentTimeMillis() + "."); } }