线程并发问题

pathuang68 2012-03-10 08:39:43
假定有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半。

请高手解惑!
...全文
273 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ctreewang 2012-08-04
  • 打赏
  • 举报
回复
线程切换?估计只在一个cpu上切换了!!!应该然每个线程亲缘每个cpu,时间就一半了
pathuang68 2012-03-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bao110908 的回复:]

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

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

不是两个时间加起来的,当两个线程同时运行的时候,interval0 和interval1其中的任何一个和用单个线程运算的时间相当,如果加起来就是单个线程运行时间的两倍了。

事实上,我不需要计算两个线程运行的总时间。我只需要max(interval0, interval1)比较小就好了,比如,大致为单个线程运行时间的一半,这就是我期待的结果。
  • 打赏
  • 举报
回复
你这个测试时间不对的话?两个线程执行的话,并不是把 interval 0 与 interval 1 的值相加就可以的,因为他们是并行计算的,时间是会叠加的。

你应该用 join 或者 CountDownLatch 来计算两个线程总的计算时间。
pathuang68 2012-03-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiaohebian 的回复:]

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

我这个代码应该不涉及并发安全方面的问题,而且也很容易证明他们是同时执行的:在各自的run方法中增加一个输出语句就可以看到这一点。
xiaohebian 2012-03-10
  • 打赏
  • 举报
回复
多线程只是考虑并发安全问题,即使你CPU是双核的,它也是一个一个执行,并不能2个线程一起执行
pathuang68 2012-03-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goldenfish1919 的回复:]

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

处理器是双核的。

两个线程处理的数据是彼此独立的。
gaoxiaoyun00130901 2012-03-10
  • 打赏
  • 举报
回复
不错不错。。。。
Mainstream_Code 2012-03-10
  • 打赏
  • 举报
回复
我的理解是 某些情况下 多线程并不比单线程快,比如有4个cpu a b c d4个线程e f g h
a执行e 其余的休息
d执行f 其余的休息
。。。。。。
只不过他们间隔的时间端
如果是一个cpu
这个线程执行下 那个线程执行下
若鱼1919 2012-03-10
  • 打赏
  • 举报
回复
(1)是多处理器吗?单处理器上,cpu密集型的操作,线程切换显然会降低性能
(2)两个线程之间有数据共享吗?线程同步也会损耗性能

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧