首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Java的scheduleWithFixedDelay使用Runnable而不是FutureTask <?>包装runnable?

Java的scheduleWithFixedDelay方法是用于创建一个周期性执行的任务。它接受一个Runnable对象作为参数,而不是FutureTask对象,有以下几个原因:

  1. 简单性:Runnable是Java中最基本的任务接口,只有一个run方法需要实现。相比之下,FutureTask是一个更复杂的类,它实现了Runnable和Future接口,需要更多的代码来使用和管理。
  2. 可扩展性:使用Runnable作为参数,可以方便地扩展和重用现有的任务实现。如果使用FutureTask,就需要在任务实现中继承FutureTask类,限制了任务的扩展性。
  3. 任务执行结果:scheduleWithFixedDelay方法返回一个ScheduledFuture对象,用于管理任务的执行和获取结果。由于Runnable没有返回值,所以不需要使用FutureTask来包装任务。

总结起来,使用Runnable作为参数可以简化代码,提高可扩展性,并且符合任务执行的特点。对于需要获取任务执行结果的情况,可以使用Callable接口来代替Runnable,并使用ExecutorService的submit方法来提交任务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Executor框架

    在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被 一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收。 操作系统会调度所有线程并将它们分配给可用的CPU。 在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上。这种两级调度模型的示意图下面有介绍。 从下图中可以看出,应用程序通过Executor框架控制上层的调度;而下层的调度由操作系统内核控制,下层的调度不受应用程序的控制。

    01

    JUC线程池扩展可回调的Future

    最近在看JUC线程池java.util.concurrent.ThreadPoolExecutor的源码实现,其中了解到java.util.concurrent.Future的实现原理。从目前java.util.concurrent.Future的实现来看,虽然实现了异步提交任务,但是任务结果的获取过程需要主动调用Future#get()或者Future#get(long timeout, TimeUnit unit),而前者是阻塞的,后者在异步任务执行时间不确定的情况下有可能需要进行轮询,这两种情况和异步调用的初衷有点相违背。于是笔者想结合目前了解到的Future实现原理的前提下扩展出支持(监听)回调的Future,思路上参考了Guava增强的ListenableFuture。本文编写的时候使用的JDK是JDK11,代码可以在JDK[8,12]版本上运行,其他版本可能不适合。

    01
    领券