`

java线程:关于Callable和Future的简单使用:有返回值的线程

 
阅读更多

 


分类: java_线程 53人阅读 评论(0) 收藏 举报
[java] view plaincopy
  1. import java.util.Random;  
  2. import java.util.concurrent.Callable;  
  3. import java.util.concurrent.ExecutorService;  
  4. import java.util.concurrent.Executors;  
  5. import java.util.concurrent.Future;  
  6.   
  7. /** 
  8.  * 关于Callable和Future的简单使用:有返回值的线程 
  9.  *  
  10.  */   
  11. public class CallableAndFutureTest {  
  12.       
  13.     public static void main(String[] args) {  
  14.           
  15.         // 创建5个固定线程的数量的线程池  
  16.         ExecutorService threadPool = Executors.newFixedThreadPool(5);  
  17.           
  18.         // 提交20个任务对象  
  19.         for(int i = 0; i < 20; i++){  
  20.             Future<String> future = threadPool.submit(new Callable<String>() {  
  21.                 @Override  
  22.                 public String call() throws Exception {  
  23.                     return new Random().nextInt() + "";  
  24.                 }  
  25.             });  
  26.               
  27.             try {  
  28.                 sop(i+ ": " + future.get()); // 获取结果并打印  
  29.             } catch (Exception e) {  
  30.                 // future有可能为null,为了防止空指针异常,有必要做出判断  
  31.                 if( future != null ){  
  32.                     // 抛出异常用,取消任务,并关闭线程池  
  33.                     future.cancel(true);  
  34.                     threadPool.shutdownNow(); // 可选  
  35.                 }  
  36.                 throw new RuntimeException(e);  
  37.             }  
  38.         }  
  39.     }  
  40.       
  41.     private static void sop(Object obj){  
  42.         System.out.println(obj);  
  43.     }  
  44. }  
  45.   
  46. /** 
  47.  * Future: 
  48.  *      Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获 
  49.  *      取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此 
  50.  *      方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消 
  51.  *      了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的 
  52.  *      结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。 
  53.  *  
  54.  * Future的体系: 
  55.  *          Future<V> 
  56.  *              |--- RunnableFuture<V> 
  57.  *              |--- ScheduledFuture<V> 
  58.  *                  |--- RunnableScheduledFuture<V> 
  59.  *  
  60.  *      1)RunnableFuture: 
  61.  *          public interface RunnableFuture<V> extends Runnable, Future<V> 
  62.  *          实现了 Runnable 的 Future,成功执行 run 方法可以完成 Future 并允许访问其结果。 
  63.  *       
  64.  *      2)RunnableScheduledFuture: 
  65.  *          public interface RunnableScheduledFuture<V>extends RunnableFuture<V>, ScheduledFuture<V> 
  66.  *       
  67.  *      3)对于Future体系,一般只需要Future就可以满足到需求 
  68.  *  
  69.  * Future中的方法: 
  70.  *      V get(): 
  71.  *          等待任务执行完毕,获取结果,阻塞性的方法; 
  72.  *  
  73.  *      boolean cancel(boolean mayInterruptIfRunning): 
  74.  *          试图取消对此任务的执行。如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用 cancel 
  75.  *          时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则 mayInterruptIfRunning 参数确定是 
  76.  *          否应该以试图停止任务的方式来中断执行此任务的线程。  
  77.  *          此方法返回后,对 isDone() 的后续调用将始终返回 true。如果此方法返回 true,则对 isCancelled()的后续调用将始终返 
  78.  *          回 true。 
  79.  * 
  80.  *      boolean isCancelled(): 
  81.  * 
  82.  *      boolean isDone(): 
  83.  * 
  84.  *      V get(long timeout,TimeUnit unit): 
  85.  * 
  86.  *      详细情况请查阅API 
  87.  *       
  88.  */  
分享到:
评论

相关推荐

    Java使用Callable和Future创建线程操作示例

    Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...

    Java多线程Callable和Future接口区别

    Java多线程Callable和Future接口是Java语言中两个非常重要的接口,它们都是Java多线程编程中使用的接口,用于描述异步计算的结果。在JavaSE5中引入的Callable是一个具有类型参数的范型,他的类型参数方法表示为方法...

    java并发包之Callable和Future

    使用`ExecutorService`和`Future`,我们可以方便地并行执行多个带有返回值的任务,而且不需要手动管理线程。这种模式在处理大量并发任务或进行分布式计算时尤其有用,因为它允许我们高效地利用系统资源,同时保持...

    Java多线程编程经验

    Java 5 引入了 `java.util.concurrent` 包,提供了 `Callable` 和 `Future` 接口,允许线程执行后返回结果。 #### 十四、Java线程:新特征-锁(上) Java 5 还引入了 `java.util.concurrent.locks` 包,提供了比...

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

    Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...

    Java多线程编程总结

    #### 十三、Java线程:新特征-有返回值的线程 - `Callable` 接口允许线程执行后返回结果,`Future` 接口用于获取这些结果。 #### 十四、Java线程:新特征-锁(上)&(下) - `java.util.concurrent.locks` 包提供...

    Future执行具有返回值的线程.txt

    大家都知道实现多线程的2种方式,今天来讲讲Future实现具有返回值的线程。应用场景:前端调用时无需等待线程结束返回,线程结束后需进行其它操作如更新状态、通知kafuka等。

    有返回值的线程

    总之,要实现有返回值的线程,我们可以使用Java的`Callable`接口和`Future`、`ExecutorService`等工具,这些机制允许我们在异步环境中获取任务执行的结果。对于`jdbctest`,可能包含的是使用JDBC进行数据库操作的多...

    JAVA中Callable的使用

    Callable接口位于`java.util.concurrent`包下,它的主要方法是`call()`,这个方法相当于Runnable的`run()`,但`call()`可以有返回值和抛出异常。当我们需要在线程中执行一个计算任务并获取结果时,Callable就非常...

    Java 线程开发讲座

    - **Callable接口**:配合`FutureTask`使用,实现有返回值的任务。 #### 十三、Java线程:新特征-锁 - **显式锁**:使用`ReentrantLock`类实现更高级的锁特性,如公平锁、非公平锁等。 - **读写锁**:`...

    java callable(多线程)

    ### Java Callable与多线程详解 在Java编程中,`Callable`接口是...通过以上分析和示例,我们可以看到`Callable`和`Future`在Java多线程编程中的强大功能,尤其是在需要处理复杂的异步任务和需要返回结果的情况下。

    Java_多线程编程线程:大总结

    - **有返回值的线程**:通过`Callable`和`Future`实现线程的返回值,提供了更灵活的异步编程模型。 - **锁**:高级锁机制如`ReentrantLock`,提供了比`synchronized`更灵活的锁定策略。 - **信号量**:控制对有限...

    java多线程编程总结

    通过 `Callable` 接口和 `Future` 类可以创建能够返回结果的线程。 - **锁** `ReentrantLock`、`ReadWriteLock` 等高级锁机制提供更灵活的锁定策略。 - **信号量** 通过 `Semaphore` 类来控制对有限资源的访问...

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

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

    JAVA多线程总结

    2. **有返回值的线程**:`Future`和`Callable`接口组合实现。 3. **锁**:`java.util.concurrent.locks`包提供了更灵活的锁机制,如读写锁、条件变量等。 4. **原子量**:`Atomic`类提供原子操作,确保多线程环境下...

    详解Java Callable接口实现多线程的方式

    Callable接口和Future接口的组合使用,能够实现多线程并发执行任务,并获取执行结果。 一、Callable接口简介 Callable接口是一个泛型接口,用于表示可以调用并返回结果的代码。它提供了一个call()方法,该方法...

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

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

    JAVA多线程

    Java新特性中引入了线程池、`Future`和`Callable`接口支持有返回值的线程、高级锁机制、信号量、阻塞队列等,为多线程编程提供了更强大和灵活的支持。 综上所述,Java多线程编程涉及到线程的概念、创建与启动、线程...

    java多线程.pdf

    Java多线程的使用能够提高程序的并发性能,但同时也需要注意线程安全和死锁等问题,合理设计线程的生命周期和同步机制对于编写高效、稳定的多线程程序至关重要。在开发过程中,应充分利用Java提供的并发工具类,如...

    java线程文档大全

    11. **有返回值的线程**:如果线程需要返回结果,可以使用Future和Callable接口。ExecutorService.submit()方法可以提交Callable任务并返回Future,Future.get()方法用于获取线程执行结果。 12. **原子量(Atomic ...

Global site tag (gtag.js) - Google Analytics