老师,为什么我这里输出的是11个?debug的时候输出的是10个?

老师,为什么我这里输出的是11个?debug的时候输出的是10个?

package com.imooc.test;
class MyThread implements Runnable{
	int i = 0;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(i<10) {
			System.out.println(Thread.currentThread().getName()+"正在运行"+(i+1)+"次!");
			i++;
		}
	}
	
}
public class ThreadTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyThread mt = new MyThread();
		Thread t1 = new Thread(mt);
		t1.start();
		Thread t2 = new Thread(mt);
		t2.start();
	}

}

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

正在回答

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

2回答

同学写成课件中的样子也是输出10次。

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

如果把输出语句和i++分开写,就有可能在i++执行前,两个线程都执行到了输出语句。

例如第一个线程,刚执行到输出语句还没来得及执行i++。

另一个线程也执行到了输出语句,那么第二个线程打印的时候i还在之前的值。则就会多打印一次了。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕阿莹 2018-12-07 11:57:57

因为debug的时候,是一步一步去执行的,而如果直接执行时 t2.start();是会和 t1.start();去抢的。而抢的时候,因为执行的太快,两个同时进入了第一个while循环。所以会打印11个。

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

而debug的时候:让它一步一步去执行:执行到t1.start的时候,没有人和它抢,它就把10个都占了,也不会产生重复的。

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

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 慕运维4141298 #1
    老师,那课件里为什么输出的是10次呢?我记得课件里是将i++写在了输出语句里
    2018-12-07 17:57:06
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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