- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.Callable;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Future;
- import java.util.concurrent.FutureTask;
- public class ConcurrentCalculator {
- private ExecutorService exec;
- private int cpuCoreNumber;
- private List<Future<Long>> tasks = new ArrayList<Future<Long>>();
- // 内部类
- class SumCalculator implements Callable<Long> { //线程中用来计算的部分,相当于run()方法
- private int [] numbers;
- private int start;
- private int end;
- public SumCalculator( final int [] numbers, int start, int end) {
- this .numbers = numbers;
- this .start = start;
- this .end = end;
- }
- public Long call() throws Exception {
- Long sum = 0l;
- for ( int i = start; i < end; i++) {
- sum += numbers[i];
- }
- return sum;
- }
- }
- public ConcurrentCalculator() {
- cpuCoreNumber = Runtime.getRuntime().availableProcessors();
- exec = Executors.newFixedThreadPool(cpuCoreNumber);
- }
- public Long sum( final int [] numbers) {
- // 根据CPU核心个数拆分任务,创建FutureTask并提交到Executor
- for ( int i = 0 ; i < cpuCoreNumber; i++) {
- int increment = numbers.length / cpuCoreNumber + 1 ;
- int start = increment * i;
- int end = increment * i + increment;
- if (end > numbers.length)
- end = numbers.length;
- SumCalculator subCalc = new SumCalculator(numbers, start, end);
- FutureTask<Long> task = new FutureTask<Long>(subCalc); //线程
- tasks.add(task);
- if (!exec.isShutdown()) {
- exec.submit(task); //执行线程
- }
- }
- return getResult();
- }
- /**
- * 迭代每个只任务,获得部分和,相加返回
- *
- * @return
- */
- public Long getResult() {
- Long result = 0l;
- for (Future<Long> task : tasks) {
- try {
- // 如果计算未完成则阻塞
- Long subSum = task.get(); //得到每个线程的计算结果
- result += subSum;
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
- public void close() {
- exec.shutdown();
- }
- public static void main(String[] args)
- {
- int [] numbers = new int [] { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 10 , 11 };
- ConcurrentCalculator calc = new ConcurrentCalculator();
- Long sum = calc.sum(numbers);
- System.out.println(sum);
- calc.close();
- }
- }
- 浏览: 386460 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (311)
- 网站开发及性能优化 (1)
- JQUERY滚动加载 (1)
- 网络编辑 (1)
- redis (2)
- memcache (4)
- mongodb (5)
- kafka (7)
- apache (3)
- Nexus (2)
- 操作系统 (21)
- JDK (2)
- MyEclipse (11)
- SVN (4)
- Tomcat (3)
- Solr (4)
- CENTOS (5)
- ubuntu (2)
- 新浪微博api (1)
- elasticsearch (60)
- java (28)
- MAC (6)
- Lucene (4)
- Linux (14)
- mysql (6)
- XenCenter (1)
- ext (3)
- spring (6)
- oracle (4)
- tsp (1)
- JForum (1)
- jms (1)
- CAS (1)
- jquery (6)
- freemarker (2)
- 项目管理 (5)
- CSS (3)
- 事务管理 (1)
- js (3)
- 分词 (1)
- 分词器 (1)
- oauthToken (1)
- hadoop (8)
- spark (1)
- cache (1)
- unicode (1)
- 正则表达式 (1)
- google (1)
- Postfix (4)
- windows (3)
- 搜索引擎 (1)
- notepad (1)
- nginx (1)
- outlook (1)
- Fiddler (2)
- Shadowsocks (0)
- github (1)
- 算法 (4)
- zabbix (1)
- office (2)
- maven (8)
- TeamView (1)
- csv (1)
- mikrotik (1)
- DELL (1)
- USVN (2)
- mybatis (3)
- vue (1)
- python (1)
- zxing (2)
- Intellij idea (0)
- IDEA (2)
- http (2)
- JWT (1)
- CAP (1)
- Nacos (1)
- OpenFeign (1)
- SpringCloud (1)
- feign (1)
- springboot (2)
- skywalking (1)
- 微服务 (2)
- 部署 (1)
- bootstrap (1)
最新评论
-
xam_sunny:
用楼主的第一种方法解决了乱码问题,谢谢分享。
spring 中文乱码 -
lzq570:
...
freemarker中分页
发表评论
-
如何解决Source folder is not a Java project
2020-03-31 14:46 512从资源库上检出的项目,今天准备创建一个新的类 ... -
单例模式(Singleton)的多种写法和分析
2020-01-13 17:55 436单例模式算是设计模式中最容易理解,也是最容易手写代 ... -
Java8 lambda 的使用
2019-12-24 17:52 3181.Java8 新特性介绍 原文链接 https:// ... -
Java compiler level does not match the version of the installed Java project fac
2018-10-19 17:01 407今天用Eclipse时报这个错误: -
Linux更换jdk版本,java -version还是原来的版本问题
2018-08-17 11:20 2676在服务器上更新了新的 ... -
java实现截图并保存到本地
2018-07-03 10:24 5351.java实现截图并保存到本地 提供给大家三个方法,随意 ... -
java Map
2018-02-06 15:58 522/** * 实现java 中 list集合中有几 ... -
jar 包 反编译 工具
2016-04-26 13:56 642java反编译工具直接放入class文件或jar包 -
利用StringEscapeUtils对字符串进行各种转义与反转义
2016-02-04 16:09 1817在apache commons-lang(2.3以上版本) ... -
HashMap的两种排序方式
2015-10-23 15:48 1311Map<String, Integer> ma ... -
java导出多个excel并打成zip包
2015-08-20 17:41 3332import java.io.*; impor ... -
Java中HashMap遍历的两种方式
2015-08-19 16:52 1091转]Java中HashMap遍历的两种方式 原文地址: ... -
java敏感词过滤-使用HashMap实现DFA算法
2014-12-18 11:50 731转载:http://blog.shilimin.com/2 ... -
Java实现敏感词过滤
2014-12-18 11:49 3796敏感词、文字过滤是一个网站必不可少的功能,如何 ... -
设置CXF的WebService客户端超时时长
2014-12-14 16:39 1628在使用WebService时,我们通常都会在客户端中设置请 ... -
jsoup去除HTML标签
2014-12-11 13:47 846http://jsoup.org/download -
/** * 数据转换工具类,用于将单个对象、List转换为json、xml格式的字符串 */
2014-11-18 12:31 1764注意:List中只有存放的是相应的Java对象,才能正确 ... -
java读写文件
2014-10-16 11:28 380import java.io.BufferedReade ... -
java线程安全总结
2014-08-23 22:41 622最近想将java基础的一些东西都整理整理,写下来,这是对知 ... -
Future and Callable
2014-08-23 22:40 614有的时候我们需要将 ...
相关推荐
主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项,需要的朋友可以参考下
主要介绍了Java多线程Callable和Future接口区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务
目录: 简介 Callable接口的基本用法 2.1 创建Callable任务 ...Future接口的使用 3.1 获取任务执行状态 3.2 取消任务的执行 Callable与Runnable的对比 Callable的异常处理 Callable的应用场景 最佳实践与注意事项
JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们...
解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...
支持Callable、Future、CompletableFuture等异步接口返回的推导。 支持JavaBean上的JSR303参数校验规范,包括分组验证。 对JSON请求参数的接口能够自动生成模拟JSON参数。 对一些常用字段定义能够生成有效的模拟值。...
程序猿学社的GitHub,欢迎Star ...本文已记录到github,形成...源码分析2.1 第一步,实现Callable接口2.2 FutureTask类结构图2.3 RunableFuture接口2.4 Runnable接口2.5 Future接口2.6 FutureTask源码分析后记 前言 通过上
8.Java中的Future和Callable接口 9.Java中的异常传播 10.Java中的断言(Assertions) 11.Java中的泛型(Generics) 12.Java中的反射(Reflection) 13.Java中的序列化(Serialization) 14.Java中的多线程编程...
什么是Java中的面向对象编程(OOP)?列举OOP的原则。 什么是Java中的重载和重写?它们之间有什么区别? 什么是Java中的静态方法和实例方法?它们之间有什么区别?...什么是Java中的Callable和Future接口?如何使
Callable接口和Runnable接口都是Java中的线程接口,但是它们有所不同: 1. Callable接口:Callable接口可以返回执行结果,可以抛出检查异常,适用于需要返回结果或抛出异常的场景。 2. Runnable接口:Runnable接口...
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。Callable和Runnable有几点不同: Callable规定的方法是call(),而Runnable规定的方法是run(). ...
包括被执行任务需要实现的接口:Runnable接口或者Callable接口。 任务的执行 。包括任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。Executor框架有两个关键类实现了ExecutorService...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,从而提高程序的执行...使用Callable和Future结合,这种方式可以获取线程执行的结果。 使用ForkJoinPool进行任务分割和合并,适用于递归分解任务。
首先,Future是一个接口,该接口用来返回异步的结果。 package com.itbuluoge.mythread; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException;...
引子 线程的创建和销毁比较消耗资源,... Future submit(Callable task):执行任务,有返回值,一般又来执行Callable void shutdown() :关闭线程池 AbstractExecutorService:基本实现了ExecutorService的所有方法 Th
支持Callable、Future、CompletableFuture等异步接口返回的推导。支持JavaBean上的JSR303参数校验规范,包括分组验证。对JSON请求参数的接口能够自动生成模拟JSON参数。对一些常用字段定义能够生成有效的模拟值。...
java 多线程编程 很实用 来自网上 1)包括新api介绍 2)新线程接口 Callable 和 Future 的讲解 3)线程同步知识
Java 中实现线程的三种方式及对比 Java 中创建线程主要有三种方式:继承 Thread 类创建线程类、通过 ...通过 Callable 和 Future 创建线程功能强大,但使用复杂。开发者可以根据具体情况选择合适的线程创建方式。
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 ...