博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java主线程跑了没效果_Java:为什么主线程没有进展?
阅读量:6513 次
发布时间:2019-06-24

本文共 1199 字,大约阅读时间需要 3 分钟。

我遇到了一些多线程

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提交了错误报告.我会发布链接,如果它被接受,我找到它.

转载地址:http://bxifo.baihongyu.com/

你可能感兴趣的文章
html5表单
查看>>
从决策树学习谈到贝叶斯分类算法、EM、HMM
查看>>
Android gradle provided、implementation等指令注意点
查看>>
03-01_WebLogic一些概念名词
查看>>
ABP 框架集成EF批量增加、删除、修改只针对使用mmsql的
查看>>
安卓自定义View——网易颜色渐变效果指示器
查看>>
项目问题总结(一)
查看>>
winform中webBrowser模拟网页操作中遇到的问题
查看>>
移动无线常用测试工具
查看>>
如何避免Oracle Form界面倒入.csv文件出现乱码
查看>>
Javascrtip GOTO 语句(模拟)
查看>>
工厂方法、抽象工厂、简单工厂
查看>>
JavaScript 基础,登录验证.
查看>>
Sqlite基本命令集合(linux/fedora/ubuntu)
查看>>
Centos 安装Puppet
查看>>
实战:MySQL Sending data导致查询很慢的问题详细分析(转)
查看>>
uva 11462 - Age Sort
查看>>
lua mac环境搭配
查看>>
Elasticsearch学习总结
查看>>
华三交换机vlan配置
查看>>