`

Callable和Future的简单使用

    博客分类:
  • java
 
阅读更多
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 
 *       
 */  

 

分享到:
评论

相关推荐

    【并发编程】 — Runnable、Callable、Future和FutureTask之间的关系

    2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 ...

    concurrent-csv-parser:使用 Executor 和 Callable-Future 进行并发任务处理

    技术方案基于ExecutorService、Callable、Future等高级Java并发API。 技术栈 JDK 8 Apache Maven v.3.2 构建说明 从应用程序根目录调用以下 maven 命令: mvn clean package 检查构建日志,确保构建成功: ...

    使用Java异步编程实现一个简单的网络请求.txt

    这两个任务被封装成Callable对象并返回一个Future对象,用于表示异步计算的结果。 在主线程中,我们通过调用response1.get()和response2.get()方法来获取异步计算的结果。由于这两个方法都是阻塞的(即等待异步计算...

    BAT面试官有点懵系列,Java多线程你真的理解透彻了吗?带你玩转一次多线程!Let’s go!别再out了!

    文章目录神标题引入线程和进程多线程的优势线程创建方式继承Thread类来创建和启动实现Runnable接口重写run方法创建线程类使用 Callable 和 Future 创建线程三种创建线程方式做出对比线程生命周期线程控制join线程...

    smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,.rar

    支持Callable、Future、CompletableFuture等异步接口返回的推导。 支持JavaBean上的JSR303参数校验规范,包括分组验证。 对JSON请求参数的接口能够自动生成模拟JSON参数。 对一些常用字段定义能够生成有效的模拟值。...

    \java超强笔记(超级经典)

    Callable和Future接口: Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。Callable和Runnable有几点不同: Callable规定的方法是call(),而Runnable规定...

    java7源码-scn:《疯狂Java讲义》学习

    使用Callable和Future创建线程 控制线程:join线程、后台线程、线程睡眠(sleep)、线程让步(yield)、改变线程优先级 同步代码块,同步方法synchronized 同步锁:ReentrantLock锁(具有重入性) 死锁 线程通信 线程池 2....

    疯狂JAVA讲义

    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为...

    Java并发编程实战

    6.3.2 携带结果的任务Callable与Future 6.3.3 示例:使用Future实现页面渲染器 6.3.4 在异构任务并行化中存在的局限 6.3.5 CompletionService:Executor与BlockingQueue 6.3.6 示例:使用CompletionService实现...

    个人总结的深入java多线程开发

    1)演示简单的消费者和生产者的例子: 17 2)管道的读写流处理方式 19 3)重要的演示死锁的问题—哲学家就餐问题 20 4)终止多线程程序的两种方式(轮询访问变量和interrupt方法) 23 四Concurrent包详解 25 1)Executor...

    Java 并发编程实战

    6.3.2 携带结果的任务Callable与Future 6.3.3 示例:使用Future实现页面渲染器 6.3.4 在异构任务并行化中存在的局限 6.3.5 CompletionService:Executor与BlockingQueue 6.3.6 示例:使用CompletionService实现...

    Java2核心技术.part5

    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 实现...

    Java2核心技术.part3

    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 实现...

    Java2核心技术.part1

    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-...

    Java2核心技术.part6

    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 实现...

    Java2核心技术.part4

    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 实现...

    Java2核心技术.part2

    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 实现...

Global site tag (gtag.js) - Google Analytics