`

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 
 *       
 */  

 

分享到:
评论

相关推荐

    Java中的Runnable,Callable,Future,FutureTask的比较

    在实际开发中,ExecutorService(如ThreadPoolExecutor)经常与Future和FutureTask一起使用,因为ExecutorService可以提交Runnable或Callable任务,并返回Future,从而实现对任务的异步处理和结果获取。例如: ```...

    Callable:Callable与Future在Web应用中的优化案例

    在Java编程中,Callable接口和Future接口是多线程编程中的重要工具,它们在Web应用程序的性能优化中扮演着关键角色。本篇文章将深入探讨Callable和Future如何在Web应用中提高效率并优化资源利用。 Callable接口是...

    浅谈在Java中使用Callable、Future进行并行编程

    下面是一个使用Callable和Future的简单示例: ```java import java.util.concurrent.*; public class Test { public static void main(String[] args) { ExecutorService executorService = Executors....

    【并发编程】 — 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 ...

    java Callable与Future的详解及实例

    下面是一个简单的 Callable 和 Future 示例,展示了如何创建、执行和管理 Callable 任务: ```java ExecutorService executorService = Executors.newFixedThreadPool(1); Callable&lt;String&gt; task = new MyCallable...

    Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable

    总结一下,`Runnable`用于无返回值的简单任务,`Callable`用于有返回值的任务,`Future`作为结果的容器,而`FutureTask`则将两者结合,使得`Callable`的任务可以通过`ExecutorService`执行。在实际开发中,根据需求...

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

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

    异步编程的瑞士军刀:Java中Future和Callable接口的妙用

    Java语言设计目标包括跨平台性、网络编程能力、健壮性、安全性和简单性。 ### Java的主要特点: 1. **跨平台性**:Java的口号是“一次编写,到处运行”(Write Once, Run Anywhere,简称WORA)。这得益于Java的...

    MapReduce,泛型,匿名内部类,Runnable和Callable

    而`Callable`接口则更加强大,它有一个返回结果的`call()`方法,可以抛出受检查的异常,并且可以通过Future和ExecutorService获取其计算结果。 在Java中,`Runnable`通常用于简单的无返回值的任务,而`Callable`...

    Java多线程之异步Future机制的原理和实现共5页.p

    异步Future机制通常与ExecutorService和Callable接口一起使用。ExecutorService是一个线程池服务,可以提交任务并管理它们的生命周期。Callable接口类似于Runnable,但是它允许任务有返回值。 下面是一个简单的...

    Java特别篇-关于线程创建的三种方式的总结对比

    ### Java特别篇-关于线程创建的三种方式的总结对比 ... - **使用Callable和Future接口**:这种方式支持返回结果和抛出异常,适合需要计算结果的场景。相对前两种方式更为复杂,但在某些场景下非常有用。

    JAVA多线程实现的四种方式 - FelixZh - 博客园1

    在Java中,实现多线程有四种主要方式:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细阐述这四种方式。 1. 继承Thread类 当你需要创建一个新的线程类时,可以继承Thread...

    Java多线程实现的四种方式

    在Java中,实现多线程有四种主要方法:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细探讨这四种方式。 1. 继承Thread类 在Java中,我们可以直接继承Thread类并重写其run...

    future.zip

    下面是一个简单的例子,展示了如何使用`Future`来异步计算结果: ```java ExecutorService executor = Executors.newFixedThreadPool(1); Future&lt;Integer&gt; future = executor.submit(new Callable() { @Override ...

    Java多线程Callable接口实现代码示例

    从上面的代码可以看出,Callable 接口的使用非常简单。在多线程环境中,Callable 接口可以返回结果,使得多线程编程更加方便。 Callable 接口是一个非常有用的工具,在多线程编程中可以发挥重要作用。希望本文对...

    JAVA多线程实现和应用总结

    3. 使用ExecutorService、Callable、Future实现有返回结果的多线程 在Java 5及以后版本中,ExecutorService和Future接口提供了更强大的线程管理和结果获取功能。Callable接口类似Runnable,但其call()方法可以返回...

    Java中实现线程的三种方式及对比_动力节点Java学院整理

    Java 中实现线程的三种方式及对比 Java 中创建线程主要有三种方式:继承 Thread 类创建线程类、通过 ...通过 Callable 和 Future 创建线程功能强大,但使用复杂。开发者可以根据具体情况选择合适的线程创建方式。

    有返回值的线程

    除了`Callable`和`Future`,还可以使用`Runnable`配合`ExecutorService`和`Future`来实现有返回值的线程。首先创建一个实现了`Runnable`的类,然后在内部创建一个`Future`对象,通过`ExecutorService`提交任务并获取...

    java多线程返回值使用示例(callable与futuretask)

    下面是一个使用`Callable`和`FutureTask`的简单示例: ```java import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import ...

    Java创建线程三种方式的优缺点

    缺点:实现Callable和Future创建线程比较复杂,需要使用FutureTask类来包装Callable对象。 三种方式的选择 ---------------- 在实际开发中,选择合适的线程创建方式非常重要。继承Thread类创建线程适合简单的线程...

Global site tag (gtag.js) - Google Analytics