`
kfcman
  • 浏览: 396980 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Future接口和Callable接口的使用

    博客分类:
  • java
 
阅读更多
  1. import  java.util.ArrayList;  
  2. import  java.util.List;  
  3. import  java.util.concurrent.Callable;  
  4. import  java.util.concurrent.ExecutionException;  
  5. import  java.util.concurrent.ExecutorService;  
  6. import  java.util.concurrent.Executors;  
  7. import  java.util.concurrent.Future;  
  8. import  java.util.concurrent.FutureTask;  
  9.   
  10. public   class  ConcurrentCalculator {  
  11.   
  12.     private  ExecutorService exec;  
  13.     private   int  cpuCoreNumber;  
  14.     private  List<Future<Long>> tasks =  new  ArrayList<Future<Long>>();  
  15.   
  16.     // 内部类   
  17.     class  SumCalculator  implements  Callable<Long> {  //线程中用来计算的部分,相当于run()方法   
  18.         private   int [] numbers;  
  19.         private   int  start;  
  20.         private   int  end;  
  21.   
  22.         public  SumCalculator( final   int [] numbers,  int  start,  int  end) {  
  23.             this .numbers = numbers;  
  24.             this .start = start;  
  25.             this .end = end;  
  26.         }  
  27.   
  28.         public  Long call()  throws  Exception {  
  29.             Long sum = 0l;  
  30.             for  ( int  i = start; i < end; i++) {  
  31.                 sum += numbers[i];  
  32.             }  
  33.             return  sum;  
  34.         }  
  35.     }  
  36.   
  37.     public  ConcurrentCalculator() {  
  38.         cpuCoreNumber = Runtime.getRuntime().availableProcessors();  
  39.         exec = Executors.newFixedThreadPool(cpuCoreNumber);  
  40.     }  
  41.   
  42.     public  Long sum( final   int [] numbers) {  
  43.         // 根据CPU核心个数拆分任务,创建FutureTask并提交到Executor   
  44.         for  ( int  i =  0 ; i < cpuCoreNumber; i++) {  
  45.             int  increment = numbers.length / cpuCoreNumber +  1 ;  
  46.             int  start = increment * i;  
  47.             int  end = increment * i + increment;  
  48.             if  (end > numbers.length)  
  49.                 end = numbers.length;  
  50.             SumCalculator subCalc = new  SumCalculator(numbers, start, end);  
  51.             FutureTask<Long> task = new  FutureTask<Long>(subCalc);  //线程   
  52.             tasks.add(task);  
  53.             if  (!exec.isShutdown()) {  
  54.                 exec.submit(task);        //执行线程   
  55.             }  
  56.         }  
  57.         return  getResult();  
  58.     }  
  59.   
  60.     /**  
  61.      * 迭代每个只任务,获得部分和,相加返回  
  62.      *  
  63.      * @return  
  64.      */   
  65.     public  Long getResult() {  
  66.         Long result = 0l;  
  67.         for  (Future<Long> task : tasks) {  
  68.             try  {  
  69.                 // 如果计算未完成则阻塞   
  70.                 Long subSum = task.get();   //得到每个线程的计算结果   
  71.                 result += subSum;  
  72.             } catch  (InterruptedException e) {  
  73.                 e.printStackTrace();  
  74.             } catch  (ExecutionException e) {  
  75.                 e.printStackTrace();  
  76.             }  
  77.         }  
  78.         return  result;  
  79.     }  
  80.   
  81.     public   void  close() {  
  82.         exec.shutdown();  
  83.     }  
  84.   
  85.     public   static   void  main(String[] args)  
  86.     {  
  87.         int [] numbers =  new   int [] {  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  10 ,  11  };  
  88.         ConcurrentCalculator calc = new  ConcurrentCalculator();  
  89.         Long sum = calc.sum(numbers);  
  90.         System.out.println(sum);  
  91.         calc.close();    
  92.   
  93.     }  
  94. }  
 
分享到:
评论

相关推荐

    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是一个具有类型参数的范型,他的类型参数方法表示为方法...

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

    `Future`、`FutureTask`、`Callable`和`Runnable`是Java并发编程中的核心接口和类,它们在Android开发中同样有着广泛的应用。下面将详细介绍这些概念以及它们如何协同工作。 1. `Runnable`: 这是Java中最基础的多...

    Callable和Future.doc

    Callable 和 Future 是 Java 多线程编程中两个重要的接口,它们在处理异步计算和结果获取方面发挥着关键作用。Callable 与 Runnable 相似,但具有更强大的功能,允许任务返回结果并处理异常。 Callable 接口: ...

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

    2. **Callable**: 相比Runnable,Callable接口提供了更强大的功能,它包含一个带返回值的`call()`方法。这使得Callable任务能够返回计算结果或抛出异常。例如,如果一个任务需要计算一个复杂的数学问题,Callable...

    JAVA中Callable的使用

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

    java并发包之Callable和Future

    `Callable`和`Future`的组合是Java并发包中一个强大的工具,它弥补了`Runnable`接口的不足,使得异步编程可以获取到返回值并处理异常。同时,`ExecutorService`作为线程池的实现,为并发编程提供了一种优雅的解决...

    java自定义任务类定时执行任务示例 callable和future接口使用方法

    下面我们将深入探讨`Callable`和`Future`接口的使用方法。 首先,我们创建一个自定义的`Callable`任务类`MyCallableClass`,它实现了`Callable&lt;String&gt;`接口。这个类包含一个`flag`字段,根据`flag`的值,`call()`...

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

    Java是一种广泛使用的编程语言,由Sun Microsystems公司(现属于Oracle公司)在1995年首次发布。它是一种面向对象的语言,意味着它将现实世界中的事物抽象为对象,这些对象具有属性(数据)和方法(行为)。Java语言...

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

    MapReduce可以帮助开发者在分布式环境中有效地处理海量数据,而泛型、匿名内部类以及Runnable和Callable接口则为Java编程提供了强大的工具,使我们能够编写更加灵活、安全和高效的代码。在实际开发中,结合这些技术...

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

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

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

    从Java 1.5开始,引入了Callable和Future接口,为并行编程提供了一种更为高效和便捷的解决方案。 Callable接口是Java并发库中的一个关键接口,位于`java.util.concurrent`包下。Callable接口与Runnable接口类似,但...

    Java多线程之Callable接口的实现

    然而,在一些情况下,我们需要在多线程中返回结果或者抛出异常,这时就需要使用Callable接口。 Callable接口是Java 1.5中引入的新的接口,it提供了一个call()方法,该方法可以返回结果并抛出异常。Callable接口的...

    java Future 接口使用方法详解

    Java中的`Future`接口是Java并发编程的重要组成部分,它提供了对异步计算结果的访问和控制。`Future`接口在`java.util.concurrent`包中,主要用于处理由`ExecutorService`执行的任务。`Future`模式允许我们提交一个...

    Java中的Callable接口最全讲义

    目录: 简介 Callable接口的基本用法 2.1 创建Callable任务 ...Future接口的使用 3.1 获取任务执行状态 3.2 取消任务的执行 Callable与Runnable的对比 Callable的异常处理 Callable的应用场景 最佳实践与注意事项

    java callable(多线程)

    接下来,我们通过示例代码深入理解`Callable`和`Future`的使用: ```java public class CallableAndFuture { public static class MyCallableClass implements Callable&lt;String&gt; { private int flag; public ...

    java多线程Future和Callable类示例分享

    而 `Future` 和 `Callable` 的结合使用则能解决这一问题,允许线程执行后返回一个计算结果。 1. `Callable` 类: `Callable` 是一个接口,它定义了一个 `call()` 方法,该方法在新线程中执行并返回一个结果。与 `...

    java通过Callable和Future来接收线程池的执行结果

    通过这个示例代码,我们可以看到,使用Callable和Future接口可以很方便地获取到线程执行的结果,并且可以及时地感知到线程执行中的错误。这对我们的开发工作具有重要的参考价值。 知识点: 1. Java中的线程池执行...

    详解JDK中ExecutorService与Callable和Future对线程的支持

    在上面的代码中,我们实现了两个Callable接口的实现类:Task1和Task2。Task1用于统计某个盘子的大小,Task2用于统计四个盘子的总大小。 Future ------ Future是一个接口,用于获取异步计算的结果。它提供了几个...

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

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

Global site tag (gtag.js) - Google Analytics