假定有10000个数据要处理,thread0处理前5000个数据,thread1处理后5000个数据,但我用下面的代码似乎并不能带来性能上的提升,基本上和用1个线程处理10000个数据差不多,这是为什么? Thread thread0 = new Thread(new Runnable()
{
@Override
public void run()
{
long start = System.currentTimeMillis();
                                // 很多计算0
long end = System.currentTimeMillis();
System.out.println("interval 0 = " + (end - start) + "ms");
}
}); Thread thread1 = new Thread(new Runnable()
{
@Override
public void run()

long start = System.currentTimeMillis();
                                // 很多计算1
long end = System.currentTimeMillis();
System.out.println("interval 1 = " + (end - start) + "ms");
}
});                thread0.start();
                thread1.start();
在上面代码中,如果只执行thread0,而注释掉thread1.start(),时间就几乎少用1半。请高手解惑!

解决方案 »

  1.   

    (1)是多处理器吗?单处理器上,cpu密集型的操作,线程切换显然会降低性能
    (2)两个线程之间有数据共享吗?线程同步也会损耗性能
      

  2.   

    我的理解是 某些情况下 多线程并不比单线程快,比如有4个cpu a b c d4个线程e f g h
    a执行e  其余的休息
    d执行f   其余的休息

    只不过他们间隔的时间端
    如果是一个cpu
    这个线程执行下 那个线程执行下
      

  3.   

    多线程只是考虑并发安全问题,即使你CPU是双核的,它也是一个一个执行,并不能2个线程一起执行
      

  4.   


    我这个代码应该不涉及并发安全方面的问题,而且也很容易证明他们是同时执行的:在各自的run方法中增加一个输出语句就可以看到这一点。
      

  5.   

    你这个测试时间不对的话?两个线程执行的话,并不是把 interval 0 与 interval 1 的值相加就可以的,因为他们是并行计算的,时间是会叠加的。你应该用 join 或者 CountDownLatch 来计算两个线程总的计算时间。
      

  6.   


    不是两个时间加起来的,当两个线程同时运行的时候,interval0 和interval1其中的任何一个和用单个线程运算的时间相当,如果加起来就是单个线程运行时间的两倍了。事实上,我不需要计算两个线程运行的总时间。我只需要max(interval0, interval1)比较小就好了,比如,大致为单个线程运行时间的一半,这就是我期待的结果。
      

  7.   

    线程切换?估计只在一个cpu上切换了!!!应该然每个线程亲缘每个cpu,时间就一半了