java主线程跑了没效果_Java:为什么主线程没有进展?

我遇到了一些多线程

Java程序的问题,并将其简化为一个非常简单的例子 – 我的困惑仍然不少!

它的示例程序如下所示.那么这是做什么(或者打算做什么)?好吧,main()函数从一个简单的线程开始,基于一个静态的内部类Runnable.此Runnable包含两个嵌套循环,它对局部变量“z”进行简单计算,总共10 ^ 12次迭代(10 ^ 6 * 10 ^ 6),之后将打印出结果并退出.产生这个工作线程后,主线程进入一个自己的循环,它将字符串“Z”打印到控制台,之后它休眠(使用Thread.sleep())1秒钟,然后反复重复.

所以运行这个程序,我希望它在计算线程正在完成它的工作时每1秒打印一次“Z”.

然而,事实上发生的是计算线程被启动,主线程显示第一个“Z”,但没有任何反应.它似乎挂在Thread.sleep调用中,无论是无限的还是至少很多,比请求的1000毫秒长得多.

请注意,这是在具有多线程的快速四核机器上,因此同时运行线程应该没有问题.其他核心在Windows任务管理器中显示为空闲.此外,即使在单核系统上,我也希望操作系统定期抢占计算线程,以便允许主线程打印字符串.

此外,线程之间没有共享变量或锁定,因此它们不应该相互阻塞.

更奇怪的是,它似乎对行为至关重要,Runnable中有两个嵌套循环.只需一个循环,迭代次数相同,一切都按预期工作.

我已经使用Java 1.8.0_73在Windows 10 64位上测试了这个.

有人可以解释这种行为吗?

public class Calculate {

static class Calc implements Runnable

{

@Override

public void run() {

int z = 1;

for(int i = 0; i < 1000000; i++) {

for(int j = 0; j < 1000000; j++) {

z = 3*z + 1;

}

}

System.out.println("Result: " + z);

}

}

public static void main(String[] args) throws Exception

{

Thread t = new Thread(new Calc());

t.start();

while(true) {

System.out.println("Z");

Thread.sleep(1000);

}

}

}

更新1:有人建议这可能是Busy loop in other thread delays EDT processing的重复.在我的情况下,许多症状是相同的,但很难说它们是否真的是同一个原因,因为另一个问题似乎没有完全确诊.但这很有可能.

更新2:我已向Oracle提交了错误报告.我会发布链接,如果它被接受,我找到它.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值