需求:
1:对一个大数组进行求和。
2:需要使用多线程实现。
思路:
1:将大数组根据线程的数量进行拆分。
2:每个线程对数组的部分元素进行求和。
3:等待所有线程执行完毕,返回结果。
说明:
在论坛中看到有一个帖子是使用concurrent包实现的,我这个例子没有使用concurrent包,发现也挺简单。
代码如下所示:
/**
* 多线程求和
* @author Administrator
*
*/
public class ThreadsSum {
static public long sum(final int[] array) {
if (array == null || array.length == 0) {
throw new IllegalArgumentException("array length must greater than 0");
}
final RuntimeData rd = new RuntimeData();
int threadCount = rd.getThreadCount(array);
System.out.println("thread count:" + threadCount);
//每线程计算的数组元素个数
final int lenPerThread = array.length / threadCount;
// System.out.println(lenPerThread);
for (int i = 0; i < threadCount; i++) {
final int index = i;
new Thread() {
@Override
public void run() {
long s = 0;
int start = index * lenPerThread;
int end = start + lenPerThread;
for (int j = start; j < end; j++) {
s += array[j];
}
synchronized (rd) {
rd.sum += s;
rd.finishThreadCount++;
// System.out.println("thread[" + getName() + "] finished,sum:" + d.sum);
}
};
}.start();
}
//余下的array元素
int remain = array.length % threadCount;
System.out.println("remain element count:" + remain);
long s = 0;
for (int i = array.length - remain; i < array.length; i++) {
s += array[i];
}
synchronized (rd) {
rd.sum += s;
}
while (rd.finishThreadCount != threadCount) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
return rd.sum;
}
public static void main(String[] args) {
int[] array = new int[15];
long s = System.currentTimeMillis();
long sum = 0;
for (int i = 0; i < array.length; i++) {
array[i] = i;
sum += array[i];
}
long start = System.currentTimeMillis();
System.out.println(start - s);
long sum2 = sum(array);
long end = System.currentTimeMillis();
long cost = end - start;
// System.out.println(sum);
// System.out.println(sum2 == sum);
System.out.println("sum:" + sum + ";equals:" + (sum2 == sum) + ";cost:" + cost);
}
}
/**
* 保存运行时的相关数据
*
*/
class RuntimeData {
//保存和
long sum;
//默认线程数
int defThreadCount = 17;
//已经执行完成的线程数
int finishThreadCount;
/**
* 根据数据长度获取线程数,线程数不会大于数组的长度。
* @param array
* @return
*/
public int getThreadCount(int[] array) {
if (array.length < defThreadCount) {
return array.length;
}
return defThreadCount;
}
}
分享到:
相关推荐
winform中的多线程求和
java多线程,对多线程,线程池进行封装,方便使用
从5.6版本开始Perl已经开始部分的支持多线程,而在5.8版本中进一步的得到了完善,不过目前国内对于Perl多线程编程方面的资料相对较少,由于工作上的原因可能会使用到多线程方面的东西所以写了一个测试程序,运行以后...
c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程...
父进程创建三个子线程,第一个子线程对数组的前半部分进行选择排序,第二个子进程对数组的后半部分进行选择排序,第三个子线程对两个已经排序好的数组部分进行归并排序,最后当所有子线程结束之后,父进程输出排序好...
多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程
大漠车间 多线程范例 大漠实现多绑定窗口多线程同时进行
VisualC 实效编程 60 多线程方式同时进行多项任务VisualC 实效编程 60 多线程方式同时进行多项任务VisualC 实效编程 60 多线程方式同时进行多项任务VisualC 实效编程 60 多线程方式同时进行多项任务VisualC 实效编程...
多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天
C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行
C# 多线程实例C# 多线程实例C# 多线程实例C# 多线程实例C# 多线程实例C# 多线程实例
Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...
Qt中利用OpenCV2.4.4多线程打开多摄像机 每个线程处理一个摄像机,从中拿出帧显示到主线程的Label控件上 模拟了一个16个摄像机的场景,有不开多线程和打开多线程的对比。 可以明显感觉到打开多线程后主界面不卡了。 ...
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)...
excel vba 多线程 实例 excel vba 多线程 实例