`

Future、Callable和CompletionService的使用

 
阅读更多

/**
  *  Future和Callable的使用
  */
 public static void main(String[] args) {
  
  ExecutorService service = Executors.newSingleThreadExecutor();
  
  Future<String> future = service.submit(new Callable<String>() {
   
   @Override
   public String call() throws Exception {
    Thread.sleep(2000);
    return "hello";
   }
   
  });
  
  System.out.println("等待结果");
  
  try {
   //等待1秒得不到结果,就会抛异常
   //System.out.println("取得结果=" + future.get(1, TimeUnit.SECONDS));
   //也可以不设置时间,一直等
   System.out.println("取得结果=" + future.get());
  } catch (Exception e) {
   e.printStackTrace();
  }
  
  System.out.println("程序结束");
  
 }

 

/**
  * 提交一组任务,那个任务先完成,就先返回
  */
 public static void main(String[] args) {
  
  ExecutorService threadPool = Executors.newCachedThreadPool();
  
  CompletionService<Integer> service = new ExecutorCompletionService<Integer>(threadPool);
  
  for (int i = 1; i <= 10; i++) {
   
   final int seq = i;
   
   service.submit(new Callable<Integer>() {
    
    @Override
    public Integer call() throws Exception {
     
     int time = new Random().nextInt(5000);
     Thread.sleep(time);
     
     return seq;
    }
    
   });
  }
  
  for (int i = 1; i <= 10; i++) {
   try {
    Future<Integer> future = service.take();
    System.out.println(future.get());
   } catch (Exception e) {
    e.printStackTrace();
   }
   
  }
  
 }

分享到:
评论

相关推荐

    Java利用future及时获取多线程运行结果

    使用Future和CompletionService可以实现异步计算和非阻塞的任务调用,并可以实时获取多线程运行结果。这对于Java编程中的多线程编程非常重要。 知识点: 1. 使用Future接口来实现异步计算和非阻塞的任务调用。 2. ...

    浅谈Java多线程处理中Future的妙用(附源码)

    "浅谈Java多线程处理中Future的妙用" 在Java多线程处理中,Future是一个非常重要的概念,它可以帮助我们更好地...使用Future和CompletionService可以帮助我们更好地处理并发任务,并且可以提高系统的性能和可靠性。

    JAVA核心知识点整理、面试必备

    除了多线程,还包括线程池的使用(ExecutorService,ThreadPoolExecutor),并发工具类(如Future, Callable, CompletionService),以及并发设计模式的应用。 7. **Spring框架**: 了解依赖注入、AOP(面向切面...

    通过多线程任务处理大批量耗时业务并返回结果

    2. `Runnable`或`Callable`: 这些是任务的实现,`Runnable`不返回结果,而`Callable`可以返回一个`Future`对象,包含任务的执行结果。 3. `submit()`方法:用于向`ExecutorService`提交任务,如果任务是`Callable`...

    Executor框架使用详解

    `FutureTask`类实现了`Future`和`Runnable`,可以用来包装`Callable`任务并提交给`ExecutorService`。 标签中提到的“源码”意味着深入理解Executor框架的实现原理是重要的。例如,理解`ThreadPoolExecutor`如何...

    32 请按到场顺序发言—Completion Service详解.pdf

    与直接使用`ExecutorService`不同的是,我们不是通过`Future.get()`方法阻塞等待结果,而是使用`CompletionService`的`take()`方法来获取已完成任务的第一个结果,这将返回一个`Future`对象,从中我们可以获取任务的...

    java并发(二十四)多线程结果组装

    在实际应用中,通常结合`Callable`接口使用,因为`Callable`的`call()`方法可以返回一个结果,比无返回值的`Runnable`更适合组装结果。 在进行结果组装时,可以使用`CompletionService`,它是一个接口,扩展了`...

    java.util.concurrent.uml.pdf

    ExecutorService是Executor的一个子接口,增加了submit方法,允许提交Callable和Runnable任务,并返回一个Future对象,表示异步计算的结果。submit方法有两种形式,一种接受Runnable参数并返回一个Future,另一种...

    java多线程并发编程例子

    `TestCompletionService.java`可能展示了如何结合`ExecutorService`和`Future`来使用`CompletionService`。 4. **ScheduledThreadPoolExecutor**:这个类扩展了`ThreadPoolExecutor`,增加了定时和周期性执行任务的...

    java多线程异步性

    在Java中,通常通过Future和Callable接口实现异步计算,或者使用ExecutorService和CompletionService来管理和控制异步任务。 三、ExecutorService与ThreadPoolExecutor ExecutorService是Java并发框架中的核心接口...

    JAVA并发编程实践-线程执行-学习笔记

    对于那些具有数据依赖关系或者需要返回结果的任务,Java提供了Callable接口和Future接口。Callable任务可以有返回值,而Future则用于获取Callable任务的结果。这种方式使得异步计算结果的获取成为可能。 并行运行类...

    多线程、JVM复习&面试&强化训练100题

    Executor框架包括了Executor、ExecutorService、CompletionService、Future、Callable等接口和类。Executors则是Executor框架的一个工具类,用于创建不同类型的线程池。 在实际应用中,线程池的使用场景广泛,例如...

    JAVA高质量并发详解,多线程并发深入讲解

    介绍`CompletionService`接口,以及如何使用它来管理异步任务的执行和结果。 - **第26章:使用ExecutorService停止线程服务** 讲解如何通过`shutdown`和`shutdownNow`方法来停止`ExecutorService`,并确保线程...

    02-4(马士兵)-多线程并发

    5. Future和Callable接口:Callable接口允许创建返回值的任务,而Future接口代表Callable任务的结果,并提供检查任务是否完成、获取结果、取消任务等方法。 6. Atomic类:提供了一组原子操作的类,如AtomicInteger...

    MultiThreadExample:多线程示例 Java

    此外,Java并发API(java.util.concurrent)提供了一些高级工具,如ExecutorService、Future、Callable和CompletionService,它们简化了多线程编程并提高了性能。 - ExecutorService允许我们创建线程池,管理和控制...

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

    9)已完成任务队列CompletionService 36 10)计时器CountDownLatch 37 11)周期性同步工具CyclicBarrier 38 12)异步计算的结果Future 40 13)安排线程池ScheduledExecutorService 40 五多线程面试题 41 六其他主题 41 1)...

    18.【线程池、Lambda表达式】_java线程_lambda线程池_meantbs3_

    同时,`Future`和`Callable`接口也可以与Lambda表达式结合,用于处理有返回结果的任务。通过这种方式,我们不仅可以灵活控制线程的并发执行,还可以高效地管理任务的生命周期和结果。 总结来说,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 并发编程实战

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

Global site tag (gtag.js) - Google Analytics