关于java多线程的一个问题

作者:超级管理员 更新时间:2017-10-31 17:59:28 来源:未知 点击:15642
做一个多线程的题目实现*g*g*g*g*g*g.......实现其实不难,不过中间我遇到一个地方一直很难理解。上代码上测试图就是很奇怪,为什么副线程执行一遍过后就无法执行了,只有加了sleep那段语句
做一个多线程的题目
实现
*g
*g*g
*g*g*g
.......
实现其实不难,不过中间我遇到一个地方一直很难理解。上代码


上测试图


就是很奇怪,为什么副线程执行一遍过后就无法执行了,只有加了sleep那段语句才能成功。
测试了一晚了没找到问题,可能哪些地方我还没学到?想请教一下各位大神。
-------------------------------
线程跑太快了   flag 在两个线程中不一致   可以把 flag 加锁
-------------------------------
不太确定吧.
没有加Thread.sleep0(); 当执行完之后,该线程就关闭了,一条关闭的线程应该是不能再启动的吧.
当加了Thread.sleep(0); 执行完之后,当前线程进入了阻塞状态,将处理器的时间片释放出来,当后面再调用start方法的时候,其实方法内调用了run方法,启动了该线程,所以该线程能继续执行...
这是我的思路,应该是这样吧!

后面的大神, 我要是理解错了不要喷...
-------------------------------
这是jit编译优化的问题,jit会将循环中使用到的变量直接从工作内存中读取,所以myThread线程中flag一直会是false。而添加sleep0后让出了cpu时间,实际是jmm的机制会起作用;jmm规范中会尽量保证变量在主内存和各个工作内存之间的同步但是必须要有机会执行同步机制才行,sleep0就起到这个作用。可以去了解jmm及jit。
要保证flag变量的同步,可以加上volatile关键字就好。话说你ToDo中不是有个加了volatile的flag吗?为什么不用那个?
-------------------------------
我回答一下:
线程的执行具有不确定性的。不能按照程序应该顺序执行的思路。

看你的ToDo类的 main方法中,在执行到for循环的时候之前已经开启了一个线程,理所当然的认为线程应该已经执行了。按照程序顺序执行的思路,开启线程的代码在前,for循环的代码在后,实际上当for循环执行的时候,线程还一定开始执行了,线程执行要等待操作系统分配相应的资源,如果执行for循环的时候,没有操作系统分配相应的资源,线程就不会执行。

所以按照这样的思路,当在for循环中将控制变量flag设置为true时,理所当然认为线程判断该flag变量为true后应该会执行,因为线程具有不确定性,因为在设置true的时候,你能确定线程正在执行哪一行代码,可能在你设置true的时候,它已经执行了好几次循环了,也可能它的资源被操作系统收回,停顿了。

所以你后面用try{Thread.sleep(0)}的时候,当线程被操作系统唤醒的时候,恰巧读取了变量flag=true

还有一点你要了解一下,JAVA内存模型,JAVA有它自己的内存模型,JVM规范定义了JAVA怎样进行内存同步。
Run类中的flag变量应该用volatitle,main中设置了flag=true,Run类线程实例读取的变量flag不一定true,了解一下volatitle 关键字

推荐阅读

热门内容

想了好久,还是不知道在哪出问题了,驱动包

前台错误:type Exception ...

关于java多线程的一个问题

做一个多线程的题目实现*g*g*g*g*...

萌新小白学习遇到问题,求各位大佬帮忙看一

这个是题目package edu.exa...

关于不确定字段查询问题-mybatis

本帖最后由liushuiwuyizhe于...

maven项目打包

求教。一个关于maven打包的问题---...

Java maven项目启动时报错,求救

我在svn上档下来的项目然后转成mave...

郁闷,明明已经导入这些JAR包了怎么还是

在web.xml里面加了这个配置,想通过...

一直报无法解析.hbm.xml 困扰了

一直报无法解析.hbm.xml   困扰...

一直报Could not parse m

这问题整整困扰了 我一天一夜  请大神帮...

什么原因造成mysql无法保存数据

1、我删除了所有表的主外键关联2、也没找...

最新内容

swing 判断单选框问题

    鼓动鼓动 swing  用的 windowbuilder 来进行设计的,...

关于java客户端与mqtt服务器用证书连接的问题

在网上找了很多例子,也实现了用java客户端通过证书连接mqtt服务器,但是有疑...

想了好久,还是不知道在哪出问题了,驱动包也重新下载了好几次,用户密码没问题

前台错误:type Exception reportmessage An exc...

GlassFish5部署应用报错,求大神教育

GlassFish5部署应用报错:Error occurred during d...

关于java多线程的一个问题

做一个多线程的题目实现*g*g*g*g*g*g.......实现其实不难,不过中...

萌新小白学习遇到问题,求各位大佬帮忙看一下哪里出错了?

这个是题目package edu.exam;import java.util.S...

最近学习spring aop 遇到的小白问题,求解答!!

package com.dao;import org.springframewo...

Java代码生成的随机数如果数据库的主键不能对应

建了一张表,查询到了所有题目的数量,然后根据题数随机生成你输入的几个随机数:(i...

web项目在MyEclipse部署正常,打成War包部署到外部Tomcat报空指针

如题,新人小白一个,新网大家帮帮忙用myeclipse启用外部Tomcat调试也...

IDEA里无法创建命名为build的目录?

IDEA里,无法创建命名为build的目录。提示为ignored name,无法...

魅红女性手机微博上线 魅蓝有女朋友了?

    中关村在线消息:今天上午,一个名为“魅红女性手机”的微博账号悄然上线,从...

使用spring+spring MVC + hibernate 实现不同数据库类型(sql server & orcale)切换获取数据

最近按照公司要求  搭个SSH框架   要动态切换获取数据库  网上百度了很多教...

求1到N的和

// 递归function Add($num){    switch ($num...

魅蓝打脸!未发售Note6绿色版高价转卖

    中关村在线消息:日前,有贴吧有网友晒出了他购买的海贼王典藏版的魅蓝Not...

过滤器里面可以拿到session,但是从session里面取出的值为空

本帖最后由zhouhai6833于2017-10-2710:54:55编辑用的s...

Maven的no such method错误

 这个方法在spring jar包里找到了,那么是不是有冲突了?还有我的IDEA...

curl无法获取数据,浏览器正常

curl 无法获取数据 ,报错:Empty reply from serverc...

诺基亚东家HMD新人事任命 临时CEO转正

    中关村在线消息:今天,诺基亚的东家HMD宣布了新的人事任命:临时CEO弗...

升级使用tomcat8.5,jdk8以后出现的报错

信息: Error parsing HTTP request header No...

curl 无法获取数据 Empty reply from server

curlDataTest("http://zhannei.baidu.com/a...