线程并发问题
假定有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 来计算两个线程总的计算时间。