首页
学习
活动
专区
工具
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方法来提交任务。

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

相关·内容

JavaRunnable、Callable、Future、FutureTask区别

Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关类或者接口,在Java中也是比较重要几个概念,我们通过下面的简单示例来了解一下它们作用于区别。...然后使用某个线程去执行该runnable即可实现多线程,Thread类在调用start()函数后就是执行Runnablerun()函数。...()函数有返回值,Runnablerun()函数不能将结果返回给客户程序。...FutureTask则是一个RunnableFuture,RunnableFuture实现了Runnbale又实现了Futrue这两个接口: public class FutureTask...因此FutureTask既是Future、Runnable,又是包装了Callable(如果是Runnable最终也会被转换为Callable ), 它是这两者合体。

32730

Java 六种线程池介绍

相比new Thread,Java提供四种线程池好处在于: 重用存在线程,减少对象创建、消亡开销,性能佳。 可有效控制最大并发线程数,提高系统资源使用率,同时避免过多资源竞争,避免堵塞。...适合使用在很耗时操作,但是newWorkStealingPool不是ThreadPoolExecutor扩展,它是新线程池类ForkJoinPool扩展,但是都是在统一一个Executors类中实现...(6)、newWorkStealingPool newWorkStealingPool适合使用在很耗时操作,但是newWorkStealingPool不是ThreadPoolExecutor扩展,...4、为什么要用线程池: 1.减少了创建和销毁线程次数,每个工作线程都可以被重复利用,可执行多个任务。...Java里面线程池顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,只是一个执行线程工具。真正线程池接口是ExecutorService。

25530

「有点收获」三种基本方法创建线程

挺基础知识,一开始不是很愿意写,毕竟这种简单知识大家不一定愿意看,而且容易写大众化,不过还好梳理一遍下来还算是有点收获,比如我看了 Thread 类重写 run 方法,才明白为什么可以把任务(Runnable...创建线程三种方法 线程英译是 Thread,这也是 Java 中线程对应类名,在 java.lang 包下。 注意下它实现了 Runnable 接口,下文会详细解释。 ?...所以,我们需要把 Callable 包装一下,包装Runnable 类型,这样就能传给 Thread 构造函数了。 为此,FutureTask 成为了最好选择。 ?...看下面这段代码,使用 Callable 定义一个任务对象,然后把 Callable 包装FutureTask,然后把 FutureTask 传给 Thread 构造函数,从而创建出一个线程对象。...() { // 线程需要执行任务 ...... } }; // 启动线程 t1.start(); 这里涉及一道经典面试题,即为什么使用 start 启动线程,使用 run

30230

深度解读 java 线程池设计思想及源码实现

下图是 java 线程池几个相关类继承结构: ? 先简单说说这个继承结构,Executor 位于最顶层,也是最简单,就一个 execute(Runnable runnable) 接口方法定义。...到这里,记住这个概念,在线程池使用过程中,我们是往线程池提交任务(task),使用过线程池都知道,我们提交每个任务是实现了 Runnable 接口,其实就是先将 Runnable 任务包装成...Runnable 接口, 所以每个 Runnable 通常都先包装FutureTask, 然后调用 executor.execute(Runnable command) 将其提交给线程池 我们知道...它和 Runnable 区别在于 run() 没有返回值, Callable call() 方法有返回值,同时,如果运行出现异常,call() 方法会抛出异常。...,参数 this 才是真正执行器 // 它对执行器进行了包装,每个任务结束后,将结果保存到内部一个 completionQueue 队列中 // 这也是为什么这个类名字里面有个

62520

【死磕Java并发】-----J.U.C之线程池:线程池基础架构

原文出处http://cmsblogs.com/ 『chenssy』 经历了Java内存模型、JUC基础之AQS、CAS、Lock、并发工具类、并发容器、阻塞队列、atomic类后,我们开始JUC最后一部分...,它是为"执行者接口Executor"服务存在。...> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) ThreadPoolExecutor...创建并返回“包装”ExecutorService 方法,它通过使特定于实现方法不可访问来禁用重新配置。 创建并返回 ThreadFactory 方法,它可将新创建线程设置为已知状态。...void run();} FutureTask 实现RunnableFuture接口,既可以作为Runnable被执行,也可以作为Future得到Callable返回值。

61850

java高并发系列 - 第19天:JUC中Executor框架详解1

介绍Future接口 介绍Callable接口 介绍FutureTask使用 获取异步任务执行结果几种方法 Executors框架介绍 Executors框架是Doug Lea神作,通过这个框架...scheduleWithFixedDelay:固定间隔执行任务 使用ScheduleThreadPoolExecutorscheduleWithFixedDelay方法,该方法设置了执行周期,与scheduleAtFixedRate...方法不同是,下一次执行时间是上一次任务执行完系统时间加上period,因而具体执行时间不是固定,但周期是固定,是采用相对固定延迟来执行任务。...如果某个线程因为执行异常结束,那么线程池会补充一个新线程。内部使用了无限容量LinkedBlockingQueue阻塞队列来缓存任务,任务如果比较多,如果处理不过来,会导致队列堆满,引发OOM。...FutureTaskFutureTask除了实现Future接口,还实现了Runnable接口,因此FutureTask可以交给Executor执行,也可以交给线程执行执行(Thread有个Runnable

73820

Java为什么使用单继承不是多继承?

多继承虽然能使子类同时拥有多个父类特征,但是其缺点也是很显著,主要有两方面: (1)如果在一个子类继承多个父类中拥有相同名字实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类变量...正因为有以上致命缺点,所以java中禁止一个类继承多个父类; 在接口中不能有实例变量,只能有静态常量,不能有具体方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承缺点。...,即使存在一定冲突也会在编译时提示出错; 引用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承第一个缺点。...总结: java为什么要单继承,多实现,总结如下: 若为多继承,那么当多个父类中有重复属性或者方法时,子类调用结果会含糊不清,因此用了单继承。 为什么是多实现呢?...接口中,所有属性都是 static final修饰,即常量,这个什么意思呢,由于JVM底层机制,所有static final修饰变量都在编译时期确定了其值,若在使用时,两个相同常量值不同,在编译时期就不能通过

1.5K10

Java多线程学习(八)线程池与Executor 框架

这里借用《Java并发编程艺术》提到来说一下使用线程池好处: 降低资源消耗。通过重复利用已创建线程降低线程创建和销毁造成消耗。 提高响应速度。...##二 Executor 框架 2.1 简介 Executor 框架是Java5之后引进,在Java 5之后,通过 Executor 来启动线程比使用 Thread start 方法更好,除了更易管理...(runnable, value); } 2.3 Executor 框架使用示意图 [Executor 框架使用示意图] 主线程首先要创建实现Runnable或者Callable接口任务对象...由于FutureTask实现了Runnable,程序员也可以创建FutureTask,然后直接交给ExecutorService执行。...备注: Quartz是一个由java编写任务调度库,由OpenSymphony组织开源出来。在实际项目开发中使用Quartz还是居多,比较推荐使用Quartz。

99440

Java--线程创建和启动

Java运行时,程序至少创建一个主线程,该主线程执行体不是由run()方法确定,而是由main()方法确定。 使用继承Thread类方法创建线程类时,多个线程之间无法共享线程类实例变量。...3、使用Callable和Future创建线程类 上面已经指出,通过Runnable接口创建线程时,Thread类作用是把run()方法包装成线程执行体。...那么可不可以直接把任意方法包装成线程执行体呢?Java目前不行。...问题是:Callable接口不是Runnable自接口,因此不能直接作为Threadtarget。...(Callable接口也是函数式接口,可以使用lambda表达式) 使用FutureTask包装Callable对象,该FutureTask对象封装了Callable对象call()方法返回值。

52370
领券