`
kfcman
  • 浏览: 386460 次
  • 性别: 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多线程Callable和Future接口区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

    Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务

    Java中的Callable接口最全讲义

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

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

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们...

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

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

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

    【多线程高并发编程】三 Callable源码分析

    程序猿学社的GitHub,欢迎Star ...本文已记录到github,形成...源码分析2.1 第一步,实现Callable接口2.2 FutureTask类结构图2.3 RunableFuture接口2.4 Runnable接口2.5 Future接口2.6 FutureTask源码分析后记 前言 通过上

    常用Java代码65个附示例代码

    8.Java中的Future和Callable接口 9.Java中的异常传播 10.Java中的断言(Assertions) 11.Java中的泛型(Generics) 12.Java中的反射(Reflection) 13.Java中的序列化(Serialization) 14.Java中的多线程编程...

    java经典面试题目-面经-java-Java语言的进阶概念-常用的库和框架-并发编程-网络编程-Web开发-面经

    什么是Java中的面向对象编程(OOP)?列举OOP的原则。 什么是Java中的重载和重写?它们之间有什么区别? 什么是Java中的静态方法和实例方法?它们之间有什么区别?...什么是Java中的Callable和Future接口?如何使

    线程池的实现以及底层原理.docx

    Callable接口和Runnable接口都是Java中的线程接口,但是它们有所不同: 1. Callable接口:Callable接口可以返回执行结果,可以抛出检查异常,适用于需要返回结果或抛出异常的场景。 2. Runnable接口:Runnable接口...

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

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

    线程池之Executor框架.docx

    包括被执行任务需要实现的接口:Runnable接口或者Callable接口。 任务的执行 。包括任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。Executor框架有两个关键类实现了ExecutorService...

    Java多线程的4种实现方式(源代码)

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,从而提高程序的执行...使用Callable和Future结合,这种方式可以获取线程执行的结果。 使用ForkJoinPool进行任务分割和合并,适用于递归分解任务。

    Java的Future使用方法

    首先,Future是一个接口,该接口用来返回异步的结果。 package com.itbuluoge.mythread; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException;...

    线程池ThreadPoolExecutor

    引子 线程的创建和销毁比较消耗资源,... Future submit(Callable task):执行任务,有返回值,一般又来执行Callable void shutdown() :关闭线程池 AbstractExecutorService:基本实现了ExecutorService的所有方法 Th

    115-springboot-demo-smart-doc.rar

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

    java多线程编程 新api

    java 多线程编程 很实用 来自网上 1)包括新api介绍 2)新线程接口 Callable 和 Future 的讲解 3)线程同步知识

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

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

    疯狂JAVA讲义

    7.4.1 List接口和ListIterator接口 261 7.4.2 ArrayList和Vector实现类 264 7.4.3 固定长度的List 266 7.5 Queue接口 266 7.5.1 LinkedList实现类 266 7.5.2 PriorityQueue实现类 269 7.6 Map 270 7.6.1 ...

Global site tag (gtag.js) - Google Analytics