Java7并发编程--4.4、在执行器中执行任务并且返回结果

来源:互联网 发布:全国姓名数据库 编辑:程序博客网 时间:2024/05/21 20:26

       执行器框架(Executor Framework)提供了ThreadPoolExecutor类并采用线程池来执行Callable和Runnable类型的任务,但是如果不想任务马上执行,而是想让任务过一段时间后才被执行,或者任务能够被周期性执行。为了这个目的,执行框架提供了ScheduledThreadPoolExecutor类。它是ThreadPoolExecutor的子类

  • 延迟要使用schedule方法,立即运行使用execute方法
  • shutdown()不会阻塞等待任务结束,只是发起一个有序任务的关闭,并且不接受新的任务。想要达到使用它来等待所有任务的结束阻塞。需要配合使用awaitTermination
  • awaitTermination(long timeout,TimeUnit unit):最长阻塞指定的时间,如果在这之前发生了:执行器关闭,线程中断,都不会按照指定的时间继续阻塞等待。只要所有任务完成则不会继续阻塞。
  • scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit):周期执行:意思是:提交一个runnable任务给执行器,在initialDelay时间后开始执行该任务,以后每隔period时间重复执行,但是如果任务执行时间比间隔时间长,将会被延迟执行,而不是间隔时间到了就同时执行线程任务,如果发生了异常,后续任务将被取消
  • 周期执行任务,没有返回结果,也不能关闭执行器,否则任务就会被取消了,不会执行;
  • 周期执行任务,任务间隔时间小于任务的执行时间的话,任务将被延迟执行,也就是说如果任务间隔时间小于任务执行时间的话,只有上一个任务执行完成了,下一个才会被执行()
  • scheduleWithFixedDelay 和 scheduleAtFixedRate :如果不仔细看光看api的话,还真看不出来有什么区别:他们唯一的区别是: 
        scheduleWithFixedDelay 的第三个参数是:两次任务结束和任务开始之间的间隔 
        scheduleAtFixedRate 的第三个参数是:两次任务开始之间的间隔时间 
       我刚开始看到这个解释的时候也蒙了:在任务间隔时间 小于 任务执行时间的情况下能看出这两个方法的差别。在这个场景下,scheduleAtFixedRate 的任务时间间隔就相当于没有了,上一个任务完成下一个任务马上开始。而scheduleWithFixedDelay 始终保持两次任务之间的间隔,就算上一次的任务比间隔时间大,但是下一次的任务开始之前还是有间隔时间的。

示例程序之延时执行:



示例程序之周期执行:



0 0
原创粉丝点击