老师,这里有点疑问~

老师,这里有点疑问~

http://img1.sycdn.imooc.com//climg/5eeb58ee0903034215400494.jpg老师,这里的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次,请问这个不同又是为什么呢?

正在回答

登陆购买课程后可参与讨论,去登陆

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 提问者 #1
    那个cpu不是一次只能执行一个线程吗?那怎么还能同时执行呀?
    2020-06-19 14:14:35
  • 慕丝1539783 回复 提问者 Heijyu #2
    我只是打个比方,实际情况我说了,就是cpu执行 线程0 执行到while(i<=10)时候,判断条件成立,进入while内部,没执行完,停住了,cpu跑去执行 线程1 的while(i<=10),条件也成立,进入while循环内部,也停住,cpu又跑去执行 线程0 的循环内部执行i++,执行完后,cpu再跑到 线程1 循环内部,执行i++。
    2020-06-19 14:38:07
  • Heijyu 提问者 回复 慕丝1539783 #3
    懂了懂了~!谢谢大神!
    2020-06-19 14:46:54
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行语句哎。。。是我哪里写错了我没发现吗?

http://img1.sycdn.imooc.com//climg/5eec2b2b09c6324e05940608.jpg

好帮手慕小尤 2020-06-19 10:09:21

同学你好,1. 在输出语句中进行i++与在输出语句外进行i++都是可以的。在输出语句中进行i++同学更好的查看运行了几次。

2. 测试代码是运行了十次。并未发现运行了11次,并在输出语句中进行i++与在输出语句外进行i++是没有区别的。如下图所示:

http://img1.sycdn.imooc.com//climg/5eec1d40097d73cb11070611.jpg

祝学习愉快!

  • 提问者 Heijyu #1
    啊,为什么我的跟老师的不一样?
    2020-06-19 10:57:51
  • 提问者 Heijyu #2
    老师我在另外一个回答里贴上了我的代码和运行的截图,麻烦你帮我检查一下~好纳闷啊怎么我的运行了11次。。。
    2020-06-19 11:06:01
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师