小弟在遍历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方法中写记录时间,只能记录主线程的时间吧。。多线程
先看代码
单线程: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方法中写记录时间,只能记录主线程的时间吧。。多线程
解决方案 »
- 最后一行代码中的getLength()被提示出错,不知道是怎么回事哈?跪求高人指点
- 问一个java语言规范纯理论问题
- 在jsp里怎么插入一个能播放存在web项目里的avi格式的视频的播放器
- 有谁用java做过acm上的题,请过来帮一下.
- think in java 中一段没看明白的话
- 如何在JFrame中的某个Pannl中显示某张图片?
- Tomcat5配置Mysql JDBC数据库连接池一文中的"web应用对应的.xml文件"是什么东西?
- 实在是想不出办法了,只能请教高手了!!!开出手帮忙.........
- 怎样才能让Java写的程序在一般的Windows平台(没有装JDK的机器)上运行
- 正则表达式堆栈溢出怎么破
- java在linux执行命令出错
- 高分悬赏解决一个程序问题
第二个是 for(int i=min; i<0; i++),小于0啊,第一个是 for(int i=min; i<max; i++),小于max啊,
这两个可是天壤之别,差太多了吧,难怪时间相差那么多。
第二个是 for(int i=min; i<0; i++),小于0啊,第一个是 for(int i=min; i<max; i++),小于max啊,
这两个可是天壤之别,差太多了吧,难怪时间相差那么多。不好意思我看错了。主线程从min到0,子线程从1到max。两个加起来时间跟第一个程序不一样。
好吧,求高人来解答
多线程的代码:主线程从int的最小值遍历到0,线程1从 1遍历到int的最大值。
第二个是 for(int i=min; i<0; i++),小于0啊,第一个是 for(int i=min; i<max; i++),小于max啊,
这两个可是天壤之别,差太多了吧,难怪时间相差那么多。不好意思我看错了。主线程从min到0,子线程从1到max。两个加起来时间跟第一个程序不一样。
好吧,求高人来解答
代码是没有错误的,单线程的代码是从int的最小值遍历到int的最大值,至于那个return 0其实无关紧要,只是一个测试用的,让他永久返回0而已。
多线程的代码:主线程从int的最小值遍历到0,线程1从 1遍历到int的最大值。
各位如果没有看懂我的意思的话我就这么说描述一下。
用单线程:从int的最小值遍历到int的最大值,时间大概8秒到9秒 这是我的电脑上;
用多线程:主线程从int的最小值遍历到0,用线程1从1遍历到int的最大值。两个线程都是3秒左右,因为线程1和主线程是同步进行的,所以两个方法运行完所花的时间大概也就3秒。多线程的方式明显比单线程快了2倍还多。。
我的疑问是
因为cpu在每个时间点只能处理一条指令,既然只是做遍历操作,单线程只是从小到大速度应该很快的。多线程还要再两条线程之间切换,也把int类型的数全部遍历到了。反而时间少了很多。不明白这是为什么
if(test(i) != 0){
flag = false; //如果返回值不是0则改变为true;
break;
}
帅哥,你这里是循环min到max,而在多线程中循环数只是这里一半的数量。min到0,1到max。所以速度肯定要比单线程快至少两倍。例如你开了某一个程序,那这个程序占用了你CPU百分之10左右,那多余的百分之90咋办?那如果是多线程,当你在开启第二个程序的时候,另外的百分之90就会被拿来使用,这样以便提高CPU的使用率。所以多线程就是把那 90%的空闲 模拟成另一块物理CPU,来提高你的工作效率,这样10%和90%互不干涉,不会因为堆积在一起的数据而降低CPU的效率!多线程只是共享一块数据,并不是切换内存,就是说,两个线程轮流操作一块数据。相当于是两个人一起干一个活,当然速度要快不少了。
多线程是分为了两部分,但是多线程的工作量并没有减少,只是两条线程在跑。而cpu每一个时间点只能做一件事情,那为什么多线程要快呢?而且这种遍历应该不存在阻塞情况吧。
我是这么理解的。比如我有很多球要放入一个容器中,而容器每次只能进去一个球,一条线程跑相当于我是一个人往里面扔球。多线程相当于我找了个朋友帮我扔,但是每次还是只能进去一个球。。两个人切换着扔,感觉时间应该要得更多。因为在切换
这是我对多线程的疑问,根据程序运行的结果,我知道我上面的理解是错误的。但是不知道多线程到底是怎样的。或者说是因为cpu是双核的?单核cpu是我说的上面这种情况么?
多线程是分为了两部分,但是多线程的工作量并没有减少,只是两条线程在跑。而cpu每一个时间点只能做一件事情,那为什么多线程要快呢?而且这种遍历应该不存在阻塞情况吧。
我是这么理解的。比如我有很多球要放入一个容器中,而容器每次只能进去一个球,一条线程跑相当于我是一个人往里面扔球。多线程相当于我找了个朋友帮我扔,但是每次还是只能进去一个球。。两个人切换着扔,感觉时间应该要得更多。因为在切换
这是我对多线程的疑问,根据程序运行的结果,我知道我上面的理解是错误的。但是不知道多线程到底是怎样的。或者说是因为cpu是双核的?单核cpu是我说的上面这种情况么?
应该两个人不需要切换着扔,你的电脑是多核的,两个人是可以同时扔的。
多线程是分为了两部分,但是多线程的工作量并没有减少,只是两条线程在跑。而cpu每一个时间点只能做一件事情,那为什么多线程要快呢?而且这种遍历应该不存在阻塞情况吧。
我是这么理解的。比如我有很多球要放入一个容器中,而容器每次只能进去一个球,一条线程跑相当于我是一个人往里面扔球。多线程相当于我找了个朋友帮我扔,但是每次还是只能进去一个球。。两个人切换着扔,感觉时间应该要得更多。因为在切换
这是我对多线程的疑问,根据程序运行的结果,我知道我上面的理解是错误的。但是不知道多线程到底是怎样的。或者说是因为cpu是双核的?单核cpu是我说的上面这种情况么?
如果是单核,两个线程是相互竞争的,是切换时间片,但是这个时间是很小的。一般在20ms左右,因此如果只是开两个线程,这个时间可以忽略。如果电脑是双核的,那么就相当于你和你朋友一起往里面扔球。两个人各干各的事情,不存在切换