经过测试我发现我写的这个实现还不如java ArrayList 直接遍历相加求和快呢。
数据量大了更是如此吧。
import java.util.ArrayList;
import java.util.Random;
public class countBasic {
public static void main(String[]a){
int index = 100000;
ArrayList<Integer> numbers = new ArrayList<Integer>();
ArrayList<RunnableBasic> obj = new ArrayList<RunnableBasic>();
System.out.println("开始生成数组"+System.currentTimeMillis());
for(int i=0;i<1000*100*10;i++){
Random rd = new Random();
int t = rd.nextInt();
numbers.add(t>0?t:0-t);
}
System.out.println("生成完毕"+System.currentTimeMillis());
ArrayList<Integer> arr = new ArrayList<Integer>();
for(int j =0;j<numbers.size();j++){
arr.add(numbers.get(j));
if((j % index== 0 && j != 0 )|| (j == numbers.size()-1)){
RunnableBasic rb = new RunnableBasic();
rb.vt = new smallBasic();
rb.Numbers = arr;
obj.add(rb);
arr = new ArrayList<Integer>();
}
}
ArrayList<Thread> th = new ArrayList<Thread>();
System.out.println("分组完毕"+System.currentTimeMillis());
for(int k = 0 ; k<obj.size();k++){
new Thread(obj.get(k)).start();
}
boolean end = false;
while(!end){
int m = 0;
for(int q=0;q<obj.size();q++){
if(obj.get(q).end.equals("end")){
m++;
}
}
if(m == obj.size()){end = true;}
}
Sumcenter s = Sumcenter.getInistance();
int sum = 0;
for(int u=0;u<s.get().size();u++){
sum += s.get().get(u);
}
System.out.println("和是:"+sum);
System.out.println("计算完毕"+System.currentTimeMillis());
int au = 0;
for(int aj =0;aj<numbers.size();aj++){
// System.out.println(numbers.get(aj));
au += numbers.get(aj);
}
System.out.println("和是:"+au);
System.out.println(System.currentTimeMillis());
}
}
import java.util.ArrayList;
public class Sumcenter {
public ArrayList<Integer> Brain;
private static Sumcenter c;
private Sumcenter(){
Brain = new ArrayList<Integer>();
}
public static Sumcenter getInistance(){
if(c == null)
c = new Sumcenter();
return c;
}
public void add(int i){
Brain.add(i);
}
public ArrayList<Integer> get(){
return Brain;
}
}
public class smallBasic {
private int sum=0;
public void add(int i){
this.sum += i;
}
public int getSum(){
return this.sum;
}
}
public class RunnableBasic implements Runnable {
protected smallBasic vt;
protected ArrayList<Integer> Numbers;
protected String end ="";
public void run() {
for(int i=0;i<Numbers.size();i++){
vt.add(Numbers.get(i));
}
Sumcenter c = Sumcenter.getInistance();
c.add(vt.getSum());
end = "end";
}
}
开始生成数组1279266504921
生成完毕1279266505734
分组完毕1279266505843
和是:-1912057435
计算完毕1279266505875
和是:-1912057435
1279266505890
直接遍历相加所用时间:15
分组遍历多线程在求和所用时间:141
希望大家看看我写的代码哪里出问题了。
分享到:
相关推荐
2. **丰富的库支持**:Python 拥有庞大的标准库和第三方库,几乎涵盖了所有应用领域,如网络编程、图形用户界面、科学计算等。 3. **跨平台性**:Python 可以运行在多种操作系统上,如 Windows、Linux 和 macOS 等。...
### Delphi 面试题知识点解析 #### 一、基础知识题解析 1. **Delphi 是什么?它主要应用于什么领域?** - **Delphi** 是一种基于 Object Pascal 的集成开发环境(IDE),主要用于 Windows 平台上的应用程序开发。...
- **作用**: 由于GIL的存在,在多线程环境下,即使CPU有多核也无法充分利用多核的优势,因为同一进程中只有一个线程可以执行Python字节码。 - **影响**: 对于I/O密集型的应用,GIL的影响较小,但对于CPU密集型任务...
根据给定文件的信息,我们可以总结出一系列与Python相关的面试题及其答案。这些问题涵盖了Python的基本语法、数据类型、高级特性等多个方面。接下来,我们将详细解析这些知识点。 ### 模块和包的区别 在Python中,...
Python也提供了多线程和多进程支持,以便更好地利用多核处理器。 6. 全局解释器锁(GIL) Python中的全局解释器锁(GIL)是为了简化内存管理而设计的,它限制了同一时刻只有一个线程可以执行Python字节码。这意味着...
- 利用多进程可以充分利用多核CPU资源。 7. **深拷贝与浅拷贝** - 深拷贝创建一个全新的对象,而浅拷贝仅复制对象的引用。 - 当原对象被修改时,深拷贝的对象不受影响,而浅拷贝的对象可能会受到影响。 8. **is...
### Python面试题详解 #### 1. Python的函数参数传递 在Python中,函数参数的传递遵循“传值”而非“传引用”的原则。当传递不可变数据类型(如整数、字符串等)时,实际上是将该数据类型的值复制一份传递给函数;...
51. Java 8的ConcurrentHashMap弃用分段锁是因为分段锁在多核CPU环境下性能瓶颈,改为使用CAS和Node链表实现。 52. ConcurrentHashMap使用synchronized而非ReentrantLock是因为减少锁粒度,提高并发性能。 53. ...
通过在同一台机器上启动多个Redis实例,可以充分利用多核资源。 3. **Redis的性能优势**: - **速度**:由于数据存储在内存中,Redis的读写速度非常快,接近O(1)的时间复杂度。 - **丰富的数据类型**:支持多种...
这限制了多核CPU下的并行计算能力,但在IO密集型任务中,多线程仍然能提高效率。 - 使用`threading`库可以创建线程,但需要注意GIL的存在可能导致多线程不如预期中的并行。 以上是Python面试中常见的知识点,理解...