Executor框架使用Runnable作为基本的任务表示形式,但是Runnable有一定的局限性:不能返回一个值或抛出一个受检查的异常。实际中很多任务都是存在延迟的,如执行数据库查询、从网络上获取资源或执行复杂计算先进,对于这样的任务,Callable是一种更好的抽象:它认为入口(call)将返回一个值并并可能抛出一个异常。
Callable
定义:
package java.util.concurrent; public interface Callable<V> { V call() throws Exception; }
返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。
Future
表示一个任务的生命周期,并提供了相应的方法来判断是否已经完成或取法一个任务,以及获取任务的结果和取消任务等。
定义:
package java.util.concurrent; public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。
方法摘要:
boolean cancel(boolean mayInterruptIfRunning) 试图取消对此任务的执行。 V get() 如有必要,等待计算完成,然后获取其结果。 V get(long timeout, TimeUnit unit) 如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。 boolean isCancelled() 如果在任务正常完成前将其取消,则返回 true。 boolean isDone() 如果任务已完成,则返回 true。
如下代码:
package thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class FutureTest { public static void main(String[] args) { System.out.println("call start."); System.out.println("call:" + FutureApp.showSearch("callable......")); System.out.println("call finished."); } } class FutureApp { static ExecutorService executor = Executors.newFixedThreadPool(5); public static String showSearch(final String target) { try { Future<String> future = executor.submit(new Callable<String>() { public String call() { return "callable result"; } }); executor.shutdown(); Thread.sleep(2000); // do other things while searching return future.get(); // use future } catch (Exception ex) { return ""; } } } call start. call:callable result call finished.
相关推荐
Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...
在实际开发中,ExecutorService(如ThreadPoolExecutor)经常与Future和FutureTask一起使用,因为ExecutorService可以提交Runnable或Callable任务,并返回Future,从而实现对任务的异步处理和结果获取。例如: ```...
Callable 和 Future 在 Java 多线程编程中提供了更灵活的机制,特别是对于需要返回结果和处理异常的异步任务。Callable 通过 `call()` 方法返回结果和抛出异常,而 Future 则提供了管理和获取这些结果的手段。结合 ...
Callable,Future的使用方式,里面使用了三种使用方式分别是FutureTask,ExecutorService,ExecutorCompletionService
`Future`接口提供了获取任务结果的方法`get()`,这个方法会阻塞直到任务完成并返回结果。如果任务在执行过程中抛出异常,`get()`方法会重新抛出这个异常。此外,`Future`还提供了`isDone()`和`cancel()`等方法,用于...
Java多线程Callable和Future接口是Java语言中两个非常重要的接口,它们都是Java多线程编程中使用的接口,用于描述异步计算的结果。在JavaSE5中引入的Callable是一个具有类型参数的范型,他的类型参数方法表示为方法...
它们是设计异步任务和定时任务的重要工具,特别适用于需要获取计算结果或控制任务执行流程的场景。通过结合`ExecutorService`,我们可以灵活地管理和调度多个并发任务,从而提高程序的并发性能和可维护性。
总结一下,`Runnable`用于无返回值的简单任务,`Callable`用于有返回值的任务,`Future`作为结果的容器,而`FutureTask`则将两者结合,使得`Callable`的任务可以通过`ExecutorService`执行。在实际开发中,根据需求...
自留demo,主要是Thread-Callable-Future的基本实现。 参考文章: 1、深入理解Callable https://blog.csdn.net/qq_19431333/article/details/77483763 2、彻底理解Java的Future模式: ...
1. **任务调度**:在高并发环境下,通过Callable和Future可以实现任务的异步处理,比如在Servlet容器中,可以创建一个线程池,将耗时的操作提交到线程池,然后返回Future对象给客户端,客户端可以依据Future检查任务...
Java通过Callable和Future来接收线程池的执行结果 Java中的线程池执行结果获取一直是一个棘手的问题,对于直接继承Thread的方式或实现Runnable接口的方式,都无法获取到线程执行的返回结果。如果线程在执行过程中...
Java并发编程中的ExecutorService、Callable和Future ...在实际应用中,我们可以使用ExecutorService、Callable和Future来实现各种并发编程任务,如统计某个盘子的大小、统计多个盘子的总大小、实现高效的数据处理等。
Callable使得并行任务可以返回结果,而Future则提供了管理和控制这些任务的能力,如检查任务状态、取消任务和获取结果。这种模式在多线程编程中特别有用,特别是在处理大量计算任务时,可以显著提高程序的效率。
Runnable、Callable、Future、FutureTask有什么关联.docx
Java concurrency线程池之Callable和Future Java concurrency是一个重要的概念,在Java编程中,线程池是一个关键组件。今天,我们将详细介绍Java concurrency线程池之Callable和Future,这两个组件在Java并发编程中...
通过合规策略对服务器进行监控,确保服务器的运行、帐号在服务器上的操作符合预设的规则...进程:监控服务器上的进程,并对某些进程、目录、文件进行标识和监控,只允许指定的进程对指定目录下的指定格式文件执行写操作
Callable 接口类似 Runnable,但提供了更丰富的功能,而 Future 对象则用于管理和控制异步计算的结果。 **Callable 接口** Callable 接口与 Runnable 相比,具有以下特点: 1. **方法不同**:Callable 接口中定义了...
2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 ...
然后,我们使用Callable来定义查评论列表和查点赞列表的任务,并将其提交给线程池。最后,我们使用Future来获取Callable任务的返回值。 异步化改造接口 在上面的代码中,我们可以看到异步化改造接口的实现。我们...
在Java编程语言中,Callable接口是用于创建...通过结合ExecutorService和Future,我们可以方便地管理这些任务的执行,获取结果并处理可能出现的异常。熟练掌握Callable的使用对于编写高效、健壮的并发程序至关重要。