部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

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() + ".");  
    }  
}  

 

 

 

 

 

 

posted @ 2015-05-20 21:50  流了个火  阅读(55)  评论(0编辑  收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats