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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS9 Storyboard unwind segue反回传递事件时机详细步骤

当返回上一个界面且需要上一个界面做某事时&#xff0c;用unwind segue实现起来比delegate简单许多&#xff0c;甚至有时不适合用delegate来实现&#xff0c;那么我们就用unwind segue吧&#xff0c;而且像1->2->3这样的跳转,3视图可以通过unwind segue方便的返回到1、2任…

Eclipse之如何导入arr文件

1、arr文件 aar是android module中所有resource文件和编译后的java文件的总压缩包 aar除了包含class文件&#xff0c;还包含resource文件 2、eclipse如何导入arr文件 1&#xff09;、解压arr文件&#xff0c;一般可以看到很多文件&#xff0c;比如aidl文件夹&#xff0c;jni…

ios俩个APP之间跳转、传值

两个APP之间的跳转是通过[[UIApplication sharedApplication] openURL:url]这种方式来实现的。 1.首先设置第一个APP的url地址 2.接着设置第二个APP的url地址 3.需要跳转的时候 NSString *urlString [NSString stringWithFormat:"AppJumpSecond://%",textField.tex…

地理信息学专业软件大全

1. Envi 5.0 SP3 &#xff0c; Envi 5.0 SP3 License-32

java 只有日期的类_JAVA日期和时间类彻底解决(1)[转]

Whats your time zone?JAVA日期和时间类彻底解决(1)Page 1 of 3你是否在苦苦挣扎在JAVA语言中的日期和时间中&#xff1f;当你在计算机上显示日期和时间时&#xff0c;, 是否要快一个小时&#xff1f;或者可能要早一个小时&#xff1f;, 或者两个小时, 或者更严重&#xff1f;…

.Net Core手撸一个基于Token的权限认证

说明权限认证是确定用户身份的过程。可确定用户是否有访问资源的权力今天给大家分享一下类似JWT这种基于token的鉴权机制基于token的鉴权机制&#xff0c;它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用,不需要去考虑用户在哪一台服务器…

Mybatis-Generator(MBG)教程与Idea的MBG插件

简介 Mybatis Generator(MBG)&#xff0c;下面我们统称为MBG&#xff0c;是一个Mybatis和iBatis的代码生成器。他可以内省数据库的表&#xff08;或多个表&#xff09;然后生成可以用来访问&#xff08;多个&#xff09;表的基础对象。这样减少了项目新建时各种配置对象&#x…

net MVC 重定向总结

[HttpPost]public ActionResult StudentList(string StudName, string studName, DateTime BirthDay, FormCollection form, string controller, string Action, StudentModels student){//其中StudName为aspx页面中标签的name属性(StudName不区分大小写)//其中BirthDay为页面中…

Android之华为meta10 pro安卓8.0绑定服务(bindService)失败解决办法

1、问题 Intent intent new Intent("com.gsta.ukeyesurfing.service.UkeyService"); boolean result bindService(intent, mKeyServiceConnection, Context.BIND_AUTO_CREATE) result结果是false&#xff0c; android 8.0绑定服务失败 2、解决办法 这个服务需要…

Windows Server 2008 RemoteApp---发布应用程序

本章节一起来体验RemoteApp应用程序发布功能&#xff0c;本功能利用了微软应用程序虚拟化技术&#xff0c;打个比方&#xff0c;我这台电脑上并没有安装Excel2010&#xff0c;但我现再要用Excel2010该怎么办&#xff1f;难道去找Office2010的光盘来安装吗&#xff1f;不用这么麻…

【GIS风暴】最新全球(全国)土地利用数据集下载地址大全汇总

目 录 1. GlobeLand30 2. 地理空间数据云 3. 马里兰大学数据集 4. Modis MCD12(MODQ1\MODQ2)

.NET 中密封类的性能优势

.NET 中密封类的性能优势Intro最近看到一篇文章 Performance benefits of sealed class in .NET&#xff0c;觉得写得不错&#xff0c;翻译一下&#xff0c;分享给大家。目前看到的一些类库中其实很多并没有考虑使用密封类&#xff0c;如果你的类型是不希望被继承的&#xff0c…

java 视图对象转换_java-如何从onItemSelected()方法返回的视图对象...

onItemSelected()方法应该返回一个View作为其对象之一,在这种情况下,它是一个TextView,通过在Logcat中获取该对象的描述和哈希值进行了验证,因此该View实际上是一个TextView.通过此处显示的方法返回的视图public void onItemSelected(AdapterView> parent, View view, int p…

jQuery-1.9.1源码分析系列(十) 事件系统——事件绑定

事件绑定的方式有很多种。使用了jQuery那么原来那种绑定方式&#xff08;elem.click function(){...})就不推荐了&#xff0c;原因&#xff1f; 最主要的一个原因是elem.click fn这种方式只能绑定一个事件处理&#xff0c;多次绑定的只会保留最后一次绑定的结果。 看一下jQue…

Windows 8系统平台上应用软件安装心得

1.ArcGIS 10.2安装 需要单独安装.NET 3.5,GIS软件自带的.NET系统不识别&#xff0c;点击360云盘地址进行下载&#xff08;提取码为&#xff1a;1ed3&#xff09;。&#xff08;另外&#xff0c;Win8系统上安装.NET可以参考&#xff1a;http://blog.csdn.net/aijavaer/article/d…

JavaFX 一 出生新手村(阅读小规则)

我就不讲IDE怎么装的,网上有的是,我仅仅是说说我学习过程中遇到的,该注意的东西 1.JavaFX刚開始出是基于脚本script开发的语言,所以网上会有流传比較多关于script的JavaFX,对于被甲骨文大大(Oracle)改版后的JavaFX已经不太有用了,如今都基本靠java代码编程了,所以网上找到的scr…

Android之jni编译出现multiple definition of ‘××××ב

1、问题 编译ndk代码的时候提示 multiple definition of 2、原因 多个文件包含同一个头文件时&#xff0c;在Android.mk文件里面写了2个文件 _src_files : \common/A.cpp\common/A.cpp\ 3、解决办法 去掉一个文件&#xff0c;然后再次编译。

Android视图绘制流程完全解析,带你一步步深入了解View(二)

转自&#xff1a;http://blog.csdn.net/guolin_blog/article/details/16330267 在上一篇文章中&#xff0c;我带着大家一起剖析了一下LayoutInflater的工作原理&#xff0c;可以算是对View进行深入了解的第一步吧。那么本篇文章中&#xff0c;我们将继续对View进行深入探究&…

C# 线程问题之死锁

过多的锁定也会有麻烦。在死锁中&#xff0c;至少有两个线程被挂起&#xff0c;并等待对方解除锁定。由于两个线程都在等待对方&#xff0c;就出现了死锁&#xff0c;线程将无限等待下去。为了说明死锁&#xff0c;下面实例化 StateObject 类型的两个对象&#xff0c;并把它们传…

java requestbody map_@RequestBody 的正确使用办法

1.以前一直以为在SpringMVC环境中&#xff0c;RequestBody接收的是一个Json对象&#xff0c;一直在调试代码都没有成功&#xff0c;后来发现&#xff0c;其实 RequestBody接收的是一个Json对象的字符串&#xff0c;而不是一个Json对象。然而在ajax请求往往传的都是Json对象&…