老师,这里有点疑问~
老师,这里的while循环要有i的变化,你是把i的变化写到了输出语句中吗?为什么不是这样写呢?
class PrintRunnable implements Runnable{ int i=1; @Override public void run() { while(i<=10){ System.out.println(Thread.currentThread().getName() + " is running!"); i++; } } }
老师这两方式我都试了,运行出来截图中的运行了10次,可是代码中的运行了11次,请问这个不同又是为什么呢?
44
收起
正在回答
3回答
因为你创建了两个线程,两个线程之间是不安全的。
当i=10的时候,
线程0 运行到了while(i<=10),判断while条件成立,进入while内部,但是在还没有开始执行while的内部指令时,线程1也运行到了while(i<=10),这时候i的值还是10(线程0还没有开始执行i++),所以也判断条件成立,也进入while内部。
线程0执行完while内部时i的值为11,然后线程1才开始执行while内部,所以多执行一次循环。
简单点说,就是当i=10的时候(前面已经运行9次),有可能线程0和线程1同时读取了i=10,同时判断while(i<=10)条件成立后,进入while内部开始执行各自的指令。所以最终的结果有可能是运行了11次。但这个也是随机的,多运行几次,有时候是10次,有时候是11次。
Heijyu
2020-06-19 11:04:25
package com.imooc.runnable; class PrintRunnable implements Runnable{ int i=1; // @Override public void run() { while(i<=10){ System.out.println(Thread.currentThread().getName() + " is running!"); i++; } } } public class Test { public static void main(String[] args) { PrintRunnable pr = new PrintRunnable(); //shared by t1,t2 Thread t1 = new Thread(pr); t1.start(); Thread t2 = new Thread(pr); t2.start(); } }
老师,我又测试了一下,我的输出真的是11行语句哎。。。是我哪里写错了我没发现吗?
java工程师2020版
- 参与学习 人
- 提交作业 9400 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星