通过使用CyclicBarrier来计算Matrix中最大的值
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* Created by ltao on 2015/1/14.
* 通过使用CyclicBarrier来计算Matrix中最大的值
*/ class FindMax {
public static void findMax(int rowStart, int rowEnd, int[] maxs, int[][] matrix, int length) {
for (int i = rowStart; i < rowEnd; i++) {
int[] tmp = matrix[rowStart];
int max = -1;
for (int j = 0; j < length; j++) {
if (max < tmp[j]) {
max = tmp[j];
}
}
maxs[i] = max;
}
}
} class SubMatrix implements Runnable {
private int rowStart;
private int rowEnd;
int[] maxs;
int[][] matrix;
int length; private CyclicBarrier cyclicBarrier; public SubMatrix(int rowStart, int rowEnd, int[] maxs, int[][] matrix, int length, CyclicBarrier cyclicBarrier) {
this.rowStart = rowStart;
this.rowEnd = rowEnd;
this.maxs = maxs;
this.matrix = matrix;
this.length = length;
this.cyclicBarrier = cyclicBarrier;
} public int getRowStart() {
return rowStart;
} public void setRowStart(int rowStart) {
this.rowStart = rowStart;
} public int getRowEnd() {
return rowEnd;
} public void setRowEnd(int rowEnd) {
this.rowEnd = rowEnd;
} public int[] getMaxs() {
return maxs;
} public void setMaxs(int[] maxs) {
this.maxs = maxs;
} public int[][] getMatrix() {
return matrix;
} public void setMatrix(int[][] matrix) {
this.matrix = matrix;
} public int getLength() {
return length;
} public void setLength(int length) {
this.length = length;
} @Override
public void run() {
try {
FindMax.findMax(rowStart, rowEnd, maxs, matrix, length);
this.cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
} } } public class MatrixCounter { public static void main(String[] args) { final int row = 100000;
int length = 2000;
final int[][] matrix = new int[row][length];
Random random = new Random();
for (int i = 0; i < row; i++) {
for (int j = 0; j < length; j++) {
matrix[i][j] = random.nextInt(3000);
}
} final int[] maxs = new int[row];
int coreSize = Runtime.getRuntime().availableProcessors();
int threadNum = coreSize; if (row < coreSize) {
threadNum = row;
} CyclicBarrier cyclicBarrier = new CyclicBarrier(threadNum, new Runnable() {
@Override
public void run() {
int max = -1;
for (int i = 0; i < row; i++) {
if (maxs[i] > max) {
max = maxs[i];
}
}
System.out.println("max:" + max);
}
});
System.out.println("线程数目:"+threadNum);
ExecutorService executor = Executors.newFixedThreadPool(threadNum);
for (int i = 0; i < threadNum; i++) {
int rowSart = i * (row / threadNum);
int rowEnd = 0;
if (i != threadNum - 1) {
rowEnd = (i + 1) * (row / threadNum) - 1;
} else {
rowEnd = row - 1;
}
executor.execute(new SubMatrix(rowSart, rowEnd, maxs, matrix, length, cyclicBarrier));
} } }
通过使用CyclicBarrier来计算Matrix中最大的值的更多相关文章
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- 计算DNA中每种核苷酸的数目
问题描述:计算DNA中每种核苷酸的数目 输入文件内容: 代码: 输出结果:
- iOS7中计算UILabel中字符串的高度
iOS7中计算UILabel中字符串的高度 iOS7中出现了新的方法计算UILabel中根据给定的Font以及str计算UILabel的frameSize的方法.本人提供category如下: UIL ...
- OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数
1:分类的使用场景:想对一个类,扩充一些功能,而又不改变原来类的模型,也不用继承,这时OC中的特有语法:分类可以做到: 当然分类也是一个类,也需要声明和实现,声明在.h文件中,实现在.m文件中,格式如 ...
- (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- 如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值
如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值:比如 输入 单价,数量,计算金额. 参考: 1. 输入 单价,数量,计算金额 ...
- 【c++】计算句子中单词的平均长度
Description 编程输入一行文本,计算这行文本的单词平均长度.假设每个单词用至少一个空格或者标点(英文逗号.句号)隔开.使用C++ string类型. Input 输入一行文本,不包含数字 O ...
- python之Counter类:计算序列中出现次数最多的元素
Counter类:计算序列中出现次数最多的元素 from collections import Counter c = Counter('abcdefaddffccef') print('完整的Cou ...
- 编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。
题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127).不在范围内的不作统计. 输入描述: 输入N个字符,字符在ACSII码范围内. 输出描述: 输出范围在( ...
随机推荐
- (亲测)设置myeclipse打开默认工作空间
亲测一: 1.找到D:\MyEclipse 8.5\configuration\ config.ini 这个文件 2.找到这一行instance.area.default 3.将后面的地址替换为你想要 ...
- Android开发之TextView的下划线添加
如何给TextView添加下划线呢,最近项目中需要这个,于是就用代码添加了下划线功能.主要就是用Paint的setFlags方法来实现,具体如下: ((TextView)mScrollView.fin ...
- JavaScript 应用开发 #5:为完成的任务添加样式
判断一下任务的状态,如果是完成的任务,可以在任务项目的上面,添加一个额外的 css 类,在这个 css 类里,可以去定义完成的任务的样式.比如,把文字的颜色变成浅友色,并且在文字上面添加一条删除线.这 ...
- Eclipse下安装/配置Jrebel6.X
Eclipse3.6+下安装/配置Jrebel6.X 1. 为什么要使用Jrebel 在日常开发过程中, 一旦修改配置/在类中增加静态变量/增加方法/修改方法名等情况, tomcat不会自动加载, 需 ...
- jquery mobile入门资料
由于项目中用到了,就去看了一下视频,然后进一步的找找资源,最后自己再总结一遍!(就是动手操作一遍,不论你感觉多简单,只有动手之后,你才有可能有收获) 当然如果你喜欢看文档可以到官网仔细研究,不过喜欢快 ...
- CSS自动控制图片大小的代码
img { max-width: 800px; height: auto; } 代码中的max-width:800px限制图片的最大宽度为800像素,而下面的hight:auto很关键,可以保证图片有 ...
- Log4net 集成到MVC+EF框架
前提引用Log4Net.dll文件 1. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", ...
- DBNull与Null
DBNull与Null的区别在于,DBNull代表该字段在数据库中根本不存在,Null代表该字段在数据库中没有值.
- C#删除数组元素代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- 简单的GDI+双缓冲的分析与实现
为什么要使用双缓冲绘制 在进行多图元绘制的时候: 因为是要一个一个画上去,所以每画一个图元,系统就要做一次图形的绘制操作,图形的重绘是很占用资源的,特别当需要重绘的图形数量很多的时候,所造成的消耗就特 ...