import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * 关于Callable和Future的简单使用:有返回值的线程 * */ public class CallableAndFutureTest { public static void main(String[] args) { // 创建5个固定线程的数量的线程池 ExecutorService threadPool = Executors.newFixedThreadPool(5); // 提交20个任务对象 for(int i = 0; i < 20; i++){ Future<String> future = threadPool.submit(new Callable<String>() { @Override public String call() throws Exception { return new Random().nextInt() + ""; } }); try { sop(i+ ": " + future.get()); // 获取结果并打印 } catch (Exception e) { // future有可能为null,为了防止空指针异常,有必要做出判断 if( future != null ){ // 抛出异常用,取消任务,并关闭线程池 future.cancel(true); threadPool.shutdownNow(); // 可选 } throw new RuntimeException(e); } } } private static void sop(Object obj){ System.out.println(obj); } } /** * Future: * Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获 * 取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此 * 方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消 * 了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的 * 结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。 * * Future的体系: * Future<V> * |--- RunnableFuture<V> * |--- ScheduledFuture<V> * |--- RunnableScheduledFuture<V> * * 1)RunnableFuture: * public interface RunnableFuture<V> extends Runnable, Future<V> * 实现了 Runnable 的 Future,成功执行 run 方法可以完成 Future 并允许访问其结果。 * * 2)RunnableScheduledFuture: * public interface RunnableScheduledFuture<V>extends RunnableFuture<V>, ScheduledFuture<V> * * 3)对于Future体系,一般只需要Future就可以满足到需求 * * Future中的方法: * V get(): * 等待任务执行完毕,获取结果,阻塞性的方法; * * boolean cancel(boolean mayInterruptIfRunning): * 试图取消对此任务的执行。如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用 cancel * 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则 mayInterruptIfRunning 参数确定是 * 否应该以试图停止任务的方式来中断执行此任务的线程。 * 此方法返回后,对 isDone() 的后续调用将始终返回 true。如果此方法返回 true,则对 isCancelled()的后续调用将始终返 * 回 true。 * * boolean isCancelled(): * * boolean isDone(): * * V get(long timeout,TimeUnit unit): * * 详细情况请查阅API * */
相关推荐
在实际开发中,ExecutorService(如ThreadPoolExecutor)经常与Future和FutureTask一起使用,因为ExecutorService可以提交Runnable或Callable任务,并返回Future,从而实现对任务的异步处理和结果获取。例如: ```...
在Java编程中,Callable接口和Future接口是多线程编程中的重要工具,它们在Web应用程序的性能优化中扮演着关键角色。本篇文章将深入探讨Callable和Future如何在Web应用中提高效率并优化资源利用。 Callable接口是...
下面是一个使用Callable和Future的简单示例: ```java import java.util.concurrent.*; public class Test { public static void main(String[] args) { ExecutorService executorService = Executors....
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 ExecutorService executorService = Executors.newFixedThreadPool(1); Callable<String> task = new MyCallable...
总结一下,`Runnable`用于无返回值的简单任务,`Callable`用于有返回值的任务,`Future`作为结果的容器,而`FutureTask`则将两者结合,使得`Callable`的任务可以通过`ExecutorService`执行。在实际开发中,根据需求...
技术方案基于ExecutorService、Callable、Future等高级Java并发API。 技术栈 JDK 8 Apache Maven v.3.2 构建说明 从应用程序根目录调用以下 maven 命令: mvn clean package 检查构建日志,确保构建成功: ...
Java语言设计目标包括跨平台性、网络编程能力、健壮性、安全性和简单性。 ### Java的主要特点: 1. **跨平台性**:Java的口号是“一次编写,到处运行”(Write Once, Run Anywhere,简称WORA)。这得益于Java的...
而`Callable`接口则更加强大,它有一个返回结果的`call()`方法,可以抛出受检查的异常,并且可以通过Future和ExecutorService获取其计算结果。 在Java中,`Runnable`通常用于简单的无返回值的任务,而`Callable`...
异步Future机制通常与ExecutorService和Callable接口一起使用。ExecutorService是一个线程池服务,可以提交任务并管理它们的生命周期。Callable接口类似于Runnable,但是它允许任务有返回值。 下面是一个简单的...
### Java特别篇-关于线程创建的三种方式的总结对比 ... - **使用Callable和Future接口**:这种方式支持返回结果和抛出异常,适合需要计算结果的场景。相对前两种方式更为复杂,但在某些场景下非常有用。
在Java中,实现多线程有四种主要方式:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细阐述这四种方式。 1. 继承Thread类 当你需要创建一个新的线程类时,可以继承Thread...
在Java中,实现多线程有四种主要方法:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细探讨这四种方式。 1. 继承Thread类 在Java中,我们可以直接继承Thread类并重写其run...
下面是一个简单的例子,展示了如何使用`Future`来异步计算结果: ```java ExecutorService executor = Executors.newFixedThreadPool(1); Future<Integer> future = executor.submit(new Callable() { @Override ...
从上面的代码可以看出,Callable 接口的使用非常简单。在多线程环境中,Callable 接口可以返回结果,使得多线程编程更加方便。 Callable 接口是一个非常有用的工具,在多线程编程中可以发挥重要作用。希望本文对...
3. 使用ExecutorService、Callable、Future实现有返回结果的多线程 在Java 5及以后版本中,ExecutorService和Future接口提供了更强大的线程管理和结果获取功能。Callable接口类似Runnable,但其call()方法可以返回...
Java 中实现线程的三种方式及对比 Java 中创建线程主要有三种方式:继承 Thread 类创建线程类、通过 ...通过 Callable 和 Future 创建线程功能强大,但使用复杂。开发者可以根据具体情况选择合适的线程创建方式。
除了`Callable`和`Future`,还可以使用`Runnable`配合`ExecutorService`和`Future`来实现有返回值的线程。首先创建一个实现了`Runnable`的类,然后在内部创建一个`Future`对象,通过`ExecutorService`提交任务并获取...
下面是一个使用`Callable`和`FutureTask`的简单示例: ```java import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import ...
缺点:实现Callable和Future创建线程比较复杂,需要使用FutureTask类来包装Callable对象。 三种方式的选择 ---------------- 在实际开发中,选择合适的线程创建方式非常重要。继承Thread类创建线程适合简单的线程...