首页 > 自考资讯 > 自考知识

schedule和timetable,thread.timer

头条共创 2024-07-05

本文由华为云社区分享《【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例》,作者:Binghe。

JDK 1.5开始提供ScheduledThreadPoolExecutor类。 ScheduledThreadPoolExecutor类继承自ThreadPoolExecutor类,复用线程池来实现任务的周期性调度功能。在JDK 1.5之前,Timer和TimerTask类主要用于实现任务的周期性调度。本文简单介绍了ScheduledThreadPoolExecutor和Timer类的区别、ScheduledThreadPoolExecutor类相对于Timer类的优点,并通过一个简单的例子说明了这两个类各自如何实现任务调度。

二者的区别

线程角度

当计时器处于单线程模式时,如果特定TimerTask 任务运行时间较长,则会影响其他任务的调度和执行。 ScheduledThreadPoolExecutor是多线程模式,复用线程池。 ScheduledFutureTask任务执行时间比较长,不影响其他任务的调度和执行。

系统时间敏感度

计时器计划基于操作系统的绝对时间,如果操作系统时间发生更改,计时器计划将不再准确。 ScheduledThreadPoolExecutor调度是基于相对时间的,不受操作系统时间变化的影响。

是否捕获异常

Timer 无法捕获TimerTask 引发的异常,并且计时器是单线程的。如果计划任务发生异常,整个线程将终止,其他需要计划的任务将不会运行。 ScheduledThreadPoolExecutor实现了基于线程池的调度功能。即使某个任务抛出异常后,其他任务也可以正常运行。

任务是否具备优先级

在Timer上运行的TimerTask任务整体上没有优先级的概念,它们只是根据系统的绝对时间来运行任务。在ScheduledThreadPoolExecutor 中运行的ScheduledFutureTask 类实现java.lang.Comparable 和java.util.concurrent.Delayed 接口。这也说明ScheduledFutureTask类实现了两个非常重要的方法。一种是compareTo方法。一种是java.util.concurrent.Delayed接口的getDelay方法。 ScheduledFutureTask 类的CompareTo 方法实现任务比较。也就是说,执行时间间隔短的任务优先。 getDelay方法可以返回直到执行下一个任务的时间间隔。

是否支持对任务排序

计时器不支持任务重新排序。静态内部类DelayedWorkQueue 定义在ScheduledThreadPoolExecutor 类中。 DelayedWorkQueue 类本质上是根据自下次执行以来的时间间隔对每个需要调度的任务进行排序。只是一个实现如果没有java.lang.Runnable 接口,您将无法从TimerTask 获取返回结果。 ScheduledThreadPoolExecutor中运行的ScheduledFutureTask类继承了FutureTask类,可以检索通过Future返回的结果。通过上面对ScheduledThreadPoolExecutor和Timer类的分析和比较,看来从JDK 1.5开始,就不再需要使用Timer来实现定时任务调度了。

能否获取返回的结果

下面是一个使用Timer 和ScheduledThreadPoolExecutor 实现定时调度的简单示例。为了简单起见,我们直接使用匿名内部类来提交任务。

下面显示了

二者简单的示例

的示例源代码。

package io.binghe.concurrent.lab09;import java.util.Timer;import java.util.TimerTask;/** * @author binghe * @version 1.0.0 * @description 测试定时器*/public class TimerTest { public static void main(String[] args) throws InterruptedException { 计时器计时器=new Timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { System.out.println('测试计时器类'); } } , 1000, 1000); Thread.sleep(10000); 执行结果如下。

测试Timer 类测试Timer 类测试Timer 类测试Timer 类测试Timer 类测试Timer 类测试Timer 类测试Timer 类测试Timer 类测试Timer 类

Timer类简单示例

示例源代码如下所示。 表明。

package io.binghe.concurrent.lab09;import java.util.concurrent.*;/** * @author binghe * @version 1.0.0 * @description Test ScheduledThreadPoolExecutor */public class ScheduledThreadPoolExecutorTest { public static void main(String[] args) 抛出InterruptedException { ScheduledExecutorService UpdatedExecutorService=Executors.newScheduledThreadPool(3); selectedExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println('测试测试ScheduledThreadPoolExecutor'); } }, 1, 1, TimeUnit.SECONDS); //主线程休眠10 秒Thread.sleep(10000); System.out.println('关闭线程池.') //关闭线程池);线程池终止do { isClosed=selectedExecutorService.awaitTermination(1, TimeUnit.DAYS); System.out.println('等待线程池中的任务完成执行') } while(!isClosed); println('所有线程执行完毕,线程池关闭');

测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 测试测试ScheduledThreadPoolExecutor 正在关闭线程池.测试测试olExecutor 等待线程池中的任务完成执行,线程池关闭当所有线程执行完毕后。 注意:Timer 和ScheduledThreadPoolExecutor 还有其他用途。这里我们简单演示一下上面两种用法。您还可以自己实现更多用途。

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢