java多线程遇到的奇怪问题

xueseFtianshi 2012-10-20 03:58:26
public class TestThread1 {
public static void main(String args[]) {
Runner1 r = new Runner1();
Thread t =new Thread(r);
t.start();

for(int i=0; i<100; i++) {
System.out.println("Main Thread:------" + i);
}
}
}

class Runner1 implements Runnable {
public void run() {
for(int i=0; i<100; i++){
System.out.println("Runner1:" + i);
}
}
}
去掉主程序输出中的 + i 线程不再交替执行
不知道为什么,求解释
...全文
949 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xueseFtianshi 2012-10-21
  • 打赏
  • 举报
回复
我试了一下javap看了半天没啥不一样,又试了javap -c还是没看出有啥不一样

我把程序的主线程和另一线程都加上if
for(int i=0; i<10000000; i++) {
if (i % 10000 == 0)
System.out.println();
}
结果中确实在交替

这应该跟判断有关,也证明可能是字符串连接占用的开销比较大,导致的结果

我把循环改成100000000次,仔细看结果中间确实有分支线程的输出
MiceRice 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
我把for改成10000,有“+i”试试5次,交替很明显,去掉之后,除了中间略微闪了几下(不知是不是线程执行),剩下的就是主线程执行完,另一个才执行。
这两个对比说明这根电脑的运行速度应该没有关系吧。
还有一点要声明:我是在DOS下执行的
[/Quote]

10000次真不算啥。

有没有 +i,涉及到 String 做连接运算,所以消耗会更明显很多,也就是相当于延长了每次循环的CPU开销;那么对应的JVM执行优化策略也会不一样;基本上就这两点主要区别,你可以用javap来看看字节码就清楚了。

所谓DOS,指的是命令行下吧,也就是CMD,这个没有太大差异。


另外呢,其实这种测试方式,瓶颈其实是卡在IO上了,建议修改下:
for(int i=0; i<10000000; i++) {
if (i % 10000 == 0)
System.out.println("Main Thread:------" + i);
}
线程也这么修改下,免得刷屏刷得太快你都看不见东西。
william2ct 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 1 楼 的回复:

只是因为速度太快了而已。把for循环设置长点就是了,比如 10000000。

我把for改成10000,有“+i”试试5次,交替很明显,去掉之后,除了中间略微闪了几下(不知是不是线程执行),剩下的就是主线程执行完,另一个才执行。
这两个对比说明这根电脑的运行速度应该没有关系吧。
还有一点要声明:我是在DOS下执行的
[/Quote]
hi,在dos下执行时什么意思,记得windows98才带有DOS系统的,你是指的在命令提示符下执行的吗,这和用ide执行有什么差别吗
xueseFtianshi 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

只是因为速度太快了而已。把for循环设置长点就是了,比如 10000000。
[/Quote]
我把for改成10000,有“+i”试试5次,交替很明显,去掉之后,除了中间略微闪了几下(不知是不是线程执行),剩下的就是主线程执行完,另一个才执行。
这两个对比说明这根电脑的运行速度应该没有关系吧。
还有一点要声明:我是在DOS下执行的
liangtu 2012-10-20
  • 打赏
  • 举报
回复
程序是会交替运行的,多执行几次偶尔还是会交替的

但是CPU太快了。

CPU的运行速度是10亿次美秒!!!

xueseFtianshi 2012-10-20
  • 打赏
  • 举报
回复
我试过了,效果一样
MiceRice 2012-10-20
  • 打赏
  • 举报
回复
只是因为速度太快了而已。把for循环设置长点就是了,比如 10000000。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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