老师,这里有点疑问~
老师,这里的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版
- 参与学习 人
- 提交作业 9410 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程

恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星