日期:2014-05-20  浏览次数:20663 次

多线程中的一点疑问
小弟在遍历int类型的所有数时,对于多线程,产生了点疑问
先看代码
单线程:

public class TestNumber {

public int test(int i){
return 0;//让传入的所有int类型数都返回0
}

public void method1(){
long start = System.currentTimeMillis();
int min = Integer.MIN_VALUE;
int max = Integer.MAX_VALUE;
boolean flag = true; //记录初始值flag
for(int i=min; i<max; i++){
if(test(i) != 0){
flag = false; //如果返回值不是0则改变为true;
break;
}
}
System.out.println(flag);
long end = System.currentTimeMillis();
System.out.println("方法运行时间:"+(end-start));
}


public static void main(String[] args) {
TestNumber tn = new TestNumber();
tn.method1();
}
}

方法的某次运行结果为
true
方法运行时间:8329

多线程:


public class TestThreadNumber implements Runnable{

public int test(int i){
return 0;
}

@Override
public void run() {
long start = System.currentTimeMillis();
int min = Integer.MIN_VALUE;
int max = Integer.MAX_VALUE;
boolean flag = true;
for(int i=1; i<max; i++){
if(test(i) != 0){
flag = false;
break;
}
}
System.out.println(flag);
long end = System.currentTimeMillis();
System.out.println("线程1运行时间:"+(end-start));
}

public void test(){
int min = Integer.MIN_VALUE;
int max = Integer.MAX_VALUE;
boolean flag = true;
for(int i=min; i<0; i++){
if(test(i) != 0){
flag = false;
break;
}
}
System.out.println(flag);
}

public static void main(String[] args) {
long start = System.currentTimeMillis();
TestThreadNumber ttn = new TestThreadNumber();
Thread t = new Thread(ttn);
t.start(); //启动线程1
ttn.test();//主线程调用test方法
long end = System.currentTimeMillis();
System.out.println("主线程运行时间:"+(end-start));
}
}


方法的某次运行结果为
true
线程1运行时间:3304
true
主线程运行时间:3332


我觉得像遍历所有int类型的数,从小到大一条线程足矣,因为cpu在每个时间点上只能处理一个指令,那么从小到大遍历,应该是一件很简单的事。如果我用多线程,那么cpu反要再两条线程上不停的切换,每个时间点还是只能处理一个指令。   可是实际结果却是多线程明显快了很多,并且速度还不止一倍,这是为什么呢?这个和双核的CPU有关系么?

顺便问个小问题,怎么测试所有线程都运行完所花费的时间啊,我在main方法中写记录时间,只能记录主线程的时间吧。。
多线程

------解决方案--------------------
时间片轮转,一台电脑不可能就你一个程序在跑。竞争者还有很多,当使用多个线程的时候,是否抢到CPU的概率也就变大了呢?
------解决方案--------------------
可以再通俗点,假设你电脑是单核,相当于你和你朋友轮流扔球,你俩扔球的速度取决于扔的慢的那个人,如果有一个人扔的很慢,扔球的速度肯定是比你一个人扔的慢的。但是如果你有很多球要仍,只有你有一个人扔,那么,你的体力就相当于cpu消耗,你会越扔越慢。这时候如果是两个人扔,你们俩消耗的体力有可能只是你一个人时候的一半,所以比你一个人扔球要快。