- 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();
- }
- }
- 浏览: 396980 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 578从资源库上检出的项目,今天准备创建一个新的类 ... -
单例模式(Singleton)的多种写法和分析
2020-01-13 17:55 452单例模式算是设计模式中最容易理解,也是最容易手写代 ... -
Java8 lambda 的使用
2019-12-24 17:52 3461.Java8 新特性介绍 原文链接 https:// ... -
Java compiler level does not match the version of the installed Java project fac
2018-10-19 17:01 425今天用Eclipse时报这个错误: -
Linux更换jdk版本,java -version还是原来的版本问题
2018-08-17 11:20 2720在服务器上更新了新的 ... -
java实现截图并保存到本地
2018-07-03 10:24 5651.java实现截图并保存到本地 提供给大家三个方法,随意 ... -
java Map
2018-02-06 15:58 545/** * 实现java 中 list集合中有几 ... -
jar 包 反编译 工具
2016-04-26 13:56 668java反编译工具直接放入class文件或jar包 -
利用StringEscapeUtils对字符串进行各种转义与反转义
2016-02-04 16:09 1987在apache commons-lang(2.3以上版本) ... -
HashMap的两种排序方式
2015-10-23 15:48 1335Map<String, Integer> ma ... -
java导出多个excel并打成zip包
2015-08-20 17:41 3377import java.io.*; impor ... -
Java中HashMap遍历的两种方式
2015-08-19 16:52 1114转]Java中HashMap遍历的两种方式 原文地址: ... -
java敏感词过滤-使用HashMap实现DFA算法
2014-12-18 11:50 763转载:http://blog.shilimin.com/2 ... -
Java实现敏感词过滤
2014-12-18 11:49 3832敏感词、文字过滤是一个网站必不可少的功能,如何 ... -
设置CXF的WebService客户端超时时长
2014-12-14 16:39 1651在使用WebService时,我们通常都会在客户端中设置请 ... -
jsoup去除HTML标签
2014-12-11 13:47 895http://jsoup.org/download -
/** * 数据转换工具类,用于将单个对象、List转换为json、xml格式的字符串 */
2014-11-18 12:31 1785注意:List中只有存放的是相应的Java对象,才能正确 ... -
java读写文件
2014-10-16 11:28 397import java.io.BufferedReade ... -
java线程安全总结
2014-08-23 22:41 637最近想将java基础的一些东西都整理整理,写下来,这是对知 ... -
Future and Callable
2014-08-23 22:40 644有的时候我们需要将 ...
相关推荐
Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...
Java多线程Callable和Future接口是Java语言中两个非常重要的接口,它们都是Java多线程编程中使用的接口,用于描述异步计算的结果。在JavaSE5中引入的Callable是一个具有类型参数的范型,他的类型参数方法表示为方法...
`Future`、`FutureTask`、`Callable`和`Runnable`是Java并发编程中的核心接口和类,它们在Android开发中同样有着广泛的应用。下面将详细介绍这些概念以及它们如何协同工作。 1. `Runnable`: 这是Java中最基础的多...
Callable 和 Future 是 Java 多线程编程中两个重要的接口,它们在处理异步计算和结果获取方面发挥着关键作用。Callable 与 Runnable 相似,但具有更强大的功能,允许任务返回结果并处理异常。 Callable 接口: ...
2. **Callable**: 相比Runnable,Callable接口提供了更强大的功能,它包含一个带返回值的`call()`方法。这使得Callable任务能够返回计算结果或抛出异常。例如,如果一个任务需要计算一个复杂的数学问题,Callable...
Callable接口位于`java.util.concurrent`包下,它的主要方法是`call()`,这个方法相当于Runnable的`run()`,但`call()`可以有返回值和抛出异常。当我们需要在线程中执行一个计算任务并获取结果时,Callable就非常...
`Callable`和`Future`的组合是Java并发包中一个强大的工具,它弥补了`Runnable`接口的不足,使得异步编程可以获取到返回值并处理异常。同时,`ExecutorService`作为线程池的实现,为并发编程提供了一种优雅的解决...
下面我们将深入探讨`Callable`和`Future`接口的使用方法。 首先,我们创建一个自定义的`Callable`任务类`MyCallableClass`,它实现了`Callable<String>`接口。这个类包含一个`flag`字段,根据`flag`的值,`call()`...
Java是一种广泛使用的编程语言,由Sun Microsystems公司(现属于Oracle公司)在1995年首次发布。它是一种面向对象的语言,意味着它将现实世界中的事物抽象为对象,这些对象具有属性(数据)和方法(行为)。Java语言...
MapReduce可以帮助开发者在分布式环境中有效地处理海量数据,而泛型、匿名内部类以及Runnable和Callable接口则为Java编程提供了强大的工具,使我们能够编写更加灵活、安全和高效的代码。在实际开发中,结合这些技术...
Callable接口和Future接口的组合使用,能够实现多线程并发执行任务,并获取执行结果。 一、Callable接口简介 Callable接口是一个泛型接口,用于表示可以调用并返回结果的代码。它提供了一个call()方法,该方法...
从Java 1.5开始,引入了Callable和Future接口,为并行编程提供了一种更为高效和便捷的解决方案。 Callable接口是Java并发库中的一个关键接口,位于`java.util.concurrent`包下。Callable接口与Runnable接口类似,但...
然而,在一些情况下,我们需要在多线程中返回结果或者抛出异常,这时就需要使用Callable接口。 Callable接口是Java 1.5中引入的新的接口,it提供了一个call()方法,该方法可以返回结果并抛出异常。Callable接口的...
Java中的`Future`接口是Java并发编程的重要组成部分,它提供了对异步计算结果的访问和控制。`Future`接口在`java.util.concurrent`包中,主要用于处理由`ExecutorService`执行的任务。`Future`模式允许我们提交一个...
目录: 简介 Callable接口的基本用法 2.1 创建Callable任务 ...Future接口的使用 3.1 获取任务执行状态 3.2 取消任务的执行 Callable与Runnable的对比 Callable的异常处理 Callable的应用场景 最佳实践与注意事项
接下来,我们通过示例代码深入理解`Callable`和`Future`的使用: ```java public class CallableAndFuture { public static class MyCallableClass implements Callable<String> { private int flag; public ...
而 `Future` 和 `Callable` 的结合使用则能解决这一问题,允许线程执行后返回一个计算结果。 1. `Callable` 类: `Callable` 是一个接口,它定义了一个 `call()` 方法,该方法在新线程中执行并返回一个结果。与 `...
通过这个示例代码,我们可以看到,使用Callable和Future接口可以很方便地获取到线程执行的结果,并且可以及时地感知到线程执行中的错误。这对我们的开发工作具有重要的参考价值。 知识点: 1. Java中的线程池执行...
在上面的代码中,我们实现了两个Callable接口的实现类:Task1和Task2。Task1用于统计某个盘子的大小,Task2用于统计四个盘子的总大小。 Future ------ Future是一个接口,用于获取异步计算的结果。它提供了几个...
在Java编程中,Callable接口和Future接口是多线程编程中的重要工具,它们在Web应用程序的性能优化中扮演着关键角色。本篇文章将深入探讨Callable和Future如何在Web应用中提高效率并优化资源利用。 Callable接口是...