java利用FutureTask、ExecutorService 在多核时代充分利用CPU运算

FutureTask、ExecutorService 相关知识,请看java,API

一个使用FutureTask简单的例子:

package com.spell.threads;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.FutureTask;

/**

* 测试FutureTask的用法,如果不想分支线程阻塞主线程,又想取得分支线程的执行结果,就用FutureTask

*

*

@author Administrator

*

*/

public class FutureTaskTest {

/**

* @param args

*/

public static void main(String[] args) {

CountNum cn = new CountNum(0);

//FutureTask 这里的表示返回的是Integer

FutureTask ft = new FutureTask(cn);

Thread td = new Thread(ft);

System.out.println("futureTask开始执行计算:" + System.currentTimeMillis());

td.start();

System.out.println("main 主线程可以做些其他事情:" + System.currentTimeMillis());

try {

// futureTask的get方法会阻塞,知道可以取得结果为止

Integer result = ft.get();

System.out.println("计算的结果是:" + result);

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

System.out.println("取得分支线程执行的结果后,主线程可以继续处理其他事项");

}

}

class CountNum implements Callable {

private Integer sum;

public CountNum(Integer sum) {

this.sum = sum;

}

public Object call() throws Exception {

for (int i = 0; i < 100; i++) {

sum = sum + i;

}

// 休眠5秒钟,观察主线程行为,预期的结果是主线程会继续执行,到要取得FutureTask的结果是等待直至完成。

Thread.sleep(3000);

System.out.println("futureTask 执行完成" + System.currentTimeMillis());

return sum;

}

}运行的结果是:

futureTask开始执行计算:1280114852250

main 主线程可以做些其他事情:1280114852250

futureTask 执行完成1280114855250

计算的结果是:4950

取得分支线程执行的结果后,主线程可以继续处理其他事项

如果有多个FutureTask要执行批量运算,从而充分的利用多核CPU,可以参考下面的代码:

package com.spell.threads;

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.FutureTask;

/**

* 测试多核时代,充分的利用CPU来运算数据,并且处理返回的结果,学习API专用

*

*

@author Administrator

*

*/

public class FutureTaskAndExecutor {

/**

* @param args

*/

public static void main(String[] args) {

List> list = new ArrayList>();

// 创建线程池,线程池的大小和List.size没有啥必然的关系,一般的原则是<=list.size,多出来浪费不好

ExecutorService exec = Executors.newFixedThreadPool(5);

for (int i = 10; i < 20; i++) {

// 创建对象

FutureTask ft = new FutureTask(new GetSum(i));

// 添加到list,方便后面取得结果

list.add(ft);

// 一个个提交给线程池,当然也可以一次性的提交给线程池,exec.invokeAll(list);

exec.submit(ft);

}

// 开始统计结果

Integer total = 0;

for (FutureTask tempFt : list) {

try {

total = total + tempFt.get();

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

}

// 处理完毕,一定要记住关闭线程池,这个不能在统计之前关闭,因为如果线程多的话,执行中的可能被打断

exec.shutdown();

System.out.println("多线程计算后的总结果是:" + total);

}

}

/**

* 这个类很简单,就是统计下简单的加法(从1 到total)

*

*

@author Administrator

*

*/

class GetSum implements Callable {

private Integer total;

private Integer sum = 0;

public GetSum(Integer total) {

this.total = total;

}

public Object call() throws Exception {

for (int i = 1; i < total + 1; i++) {

sum = sum + i;

}

System.out.println(Thread.currentThread().getName() + " sum:" + sum);

return sum;

}

}运行的结果是:

pool-1-thread-1 sum:120

pool-1-thread-1 sum:136

pool-1-thread-1 sum:153

pool-1-thread-1 sum:171

pool-1-thread-1 sum:190

pool-1-thread-2 sum:66

pool-1-thread-3 sum:78

pool-1-thread-4 sum:91

pool-1-thread-5 sum:105

多线程计算后的总结果是:1165

java多核的利用率_java利用FutureTask、ExecutorService 在多核时代充分利用CPU运算相关推荐

  1. java多核的利用率_java控制多核cpu的占用率

    测试机型配置如下: 让cpu占用率最高,只要让他时钟周期一直占用就可以了,但是我发现我的cpu是四线程的,i++的while循环只能让cpu工作在25%左右,这主要是因为只有一个线程在满负荷运行,10 ...

  2. java游戏输赢统计_java利用多线程和Socket实现猜拳游戏

    本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下 实例:猜拳游戏 猜拳游戏是指小时候玩的石头.剪刀.布的游戏.客户端与服务器的"较量", ...

  3. java 特殊符号正则_java利用正则表达式处理特殊字符的方法实例

    前言 一串字符串中有特殊符号,可能会影响到相关接口业务,所以需要把字符串中的特殊字符都过滤掉 百度上面搜索大部分处理方法是通过正则表达式, 他需要处理的特殊符号都写进正则表达式中去校验, 这种方式一眼 ...

  4. java代码中 作用_Java利用开发中代码生成工具的作用

    Java利用开发中代码生成工具的作用 2010-6-5文字大小:大中小 近来,随着各种代码生成工具的不断涌现(如SpringSource的Spring Roo.Skyway Builder Commu ...

  5. java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求

    Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...

  6. java socket5源码_Java利用TCP协议实现客户端与服务器通信【附通信源码】

    进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的. TCP协议概念 先来了解一下TCP协议 ...

  7. java socket 聊天室_java利用Socket实现聊天室功能实例

    导读热词 最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人. 目录结构: ChatClient: package com.p ...

  8. java 获取百度云盘图片_java 利用百度云识别图片文字

    一.百度云使用步骤 1.进入https://console.bce.baidu.com/#/index/overview 登录百度云账号.百度所有账号都是通用的,可以直接利用百度的其他账号(百度网盘. ...

  9. java gridlayout 设置列宽_java 利用GridBagLayout布局时,如何设置单列列宽?

    展开全部 package JavaGUI; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.aw ...

最新文章

  1. Matlab与线性代数 -- 逆矩阵
  2. CentOS上编译安装Nginx
  3. ITK:将具有RGB像素的vtkImageData转换为itk :: Image
  4. Java精确到毫秒获取时间的三种方法,以及适用场景
  5. c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...
  6. 剑指offer之链表中倒数第K个节点
  7. 深入解析浏览器的幕后工作原理(一) 简介
  8. PS2020制作电子签名
  9. 沪上各区免费停车场大全
  10. mac安装ios和Android模拟器进行h5页面调试
  11. ACPYPE中FAILED: [Errno 2] No such file or directory: 'FFF_AC.prmtop'的解决方法
  12. 数据结构算法(2)--字符串匹配
  13. 一步步教你轻松学KNN模型算法
  14. 2.Enable ADB integration' to be enabled.
  15. Teamviewer过期,获取免费版
  16. C++ 实现一个复数类
  17. 关于电脑电流滋滋声解决方法
  18. 历尽千帆,归来仍少年
  19. IOS Swift 入门学习汇总 (更新中..)
  20. Internet Download Manager6.41加速器最快的电脑工具下载器

热门文章

  1. c#爬虫-1688官网自动登录
  2. Dotnet core使用JWT认证授权最佳实践(一)
  3. 【敏捷案例】老板太外行,朝令夕改!要不要拿了年终奖就撤?
  4. C#刷遍Leetcode面试题系列连载(6):No.372 - 超级次方
  5. .NET做人脸识别并分类
  6. .NET手撸绘制TypeScript类图——上篇
  7. AOP框架Dora.Interception 3.0 [1]: 编程体验
  8. 实现一个简单的基于码云(Gitee) 的 Storage
  9. 在实际项目中使用LiteDB NoSQL数据库
  10. .netcore 整合 log4net