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

线程并发问题
假定有10000个数据要处理,thread0处理前5000个数据,thread1处理后5000个数据,但我用下面的代码似乎并不能带来性能上的提升,基本上和用1个线程处理10000个数据差不多,这是为什么?
Java code

        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)是多处理器吗?单处理器上,cpu密集型的操作,线程切换显然会降低性能
(2)两个线程之间有数据共享吗?线程同步也会损耗性能
------解决方案--------------------
我的理解是 某些情况下 多线程并不比单线程快,比如有4个cpu a b c d4个线程e f g h
a执行e 其余的休息
d执行f 其余的休息
。。。。。。
只不过他们间隔的时间端
如果是一个cpu
这个线程执行下 那个线程执行下
------解决方案--------------------
不错不错。。。。
------解决方案--------------------
多线程只是考虑并发安全问题,即使你CPU是双核的,它也是一个一个执行,并不能2个线程一起执行
------解决方案--------------------
你这个测试时间不对的话?两个线程执行的话,并不是把 interval 0 与 interval 1 的值相加就可以的,因为他们是并行计算的,时间是会叠加的。

你应该用 join 或者 CountDownLatch 来计算两个线程总的计算时间。