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 * */
相关推荐
2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 ...
技术方案基于ExecutorService、Callable、Future等高级Java并发API。 技术栈 JDK 8 Apache Maven v.3.2 构建说明 从应用程序根目录调用以下 maven 命令: mvn clean package 检查构建日志,确保构建成功: ...
这两个任务被封装成Callable对象并返回一个Future对象,用于表示异步计算的结果。 在主线程中,我们通过调用response1.get()和response2.get()方法来获取异步计算的结果。由于这两个方法都是阻塞的(即等待异步计算...
文章目录神标题引入线程和进程多线程的优势线程创建方式继承Thread类来创建和启动实现Runnable接口重写run方法创建线程类使用 Callable 和 Future 创建线程三种创建线程方式做出对比线程生命周期线程控制join线程...
支持Callable、Future、CompletableFuture等异步接口返回的推导。 支持JavaBean上的JSR303参数校验规范,包括分组验证。 对JSON请求参数的接口能够自动生成模拟JSON参数。 对一些常用字段定义能够生成有效的模拟值。...
Callable和Future接口: Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。Callable和Runnable有几点不同: Callable规定的方法是call(),而Runnable规定...
使用Callable和Future创建线程 控制线程:join线程、后台线程、线程睡眠(sleep)、线程让步(yield)、改变线程优先级 同步代码块,同步方法synchronized 同步锁:ReentrantLock锁(具有重入性) 死锁 线程通信 线程池 2....
10.4.3 catch和throw同时使用 371 10.4.4 异常链 373 10.5 Java的异常跟踪栈 374 10.6 异常处理规则 376 10.6.1 不要过度使用异常 377 10.6.2 不要使用过于庞大的try块 378 10.6.3 避免使用Catch All语句 378 ...
了解线程的状态、常用方法以及Thread、Runnable、Callable、Future、FutureTask这些基础概念和简单应用。 Java多线程②——多线程知识梳理 有助于了解线程池相关的知识、包括线程池执行逻辑、常用方法; 以及java为...
6.3.2 携带结果的任务Callable与Future 6.3.3 示例:使用Future实现页面渲染器 6.3.4 在异构任务并行化中存在的局限 6.3.5 CompletionService:Executor与BlockingQueue 6.3.6 示例:使用CompletionService实现...
1)演示简单的消费者和生产者的例子: 17 2)管道的读写流处理方式 19 3)重要的演示死锁的问题—哲学家就餐问题 20 4)终止多线程程序的两种方式(轮询访问变量和interrupt方法) 23 四Concurrent包详解 25 1)Executor...
6.3.2 携带结果的任务Callable与Future 6.3.3 示例:使用Future实现页面渲染器 6.3.4 在异构任务并行化中存在的局限 6.3.5 CompletionService:Executor与BlockingQueue 6.3.6 示例:使用CompletionService实现...
1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现...
1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现...
1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现服务器 3.3 发送E-...
1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现...
1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现...
1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现...