关于一个对象创建多个线程对象

关于一个对象创建多个线程对象

public class ThreadTest {

	public static void main(String[] args) {
		RunnableDemo r1 = new RunnableDemo();
		RunnableDemo r2 = new RunnableDemo();
		RunnableDemo r3 = new RunnableDemo();
		Thread t1 = new Thread(r1, "一号线程");
		Thread t2 = new Thread(r1, "二号线程");
		Thread t3 = new Thread(r1, "三号线程");
		t1.start();
		t2.start();
		t3.start();

//		Letter l1 = new Letter();
//		Thread t1 = new Thread(l1);
//		t1.start();
	}

}
public class RunnableDemo implements Runnable {
	int i = 0;

	@Override
	public void run() {
		for (i = 0; i < 10;i++ ) {
			System.out.println(Thread.currentThread().getName() + "第" + (i + 1) + "次执行");
		}

	}

}

运行后结果:

二号线程第2次执行

三号线程第1次执行

一号线程第1次执行

一号线程第5次执行

三号线程第4次执行

三号线程第7次执行

三号线程第8次执行

三号线程第9次执行

二号线程第3次执行

三号线程第10次执行

一号线程第6次执行

为什么多次运行结果都是11次输出,而且第1次执行会有两个输出呢?

正在回答 回答被采纳积分+1

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

2回答
好帮手慕小尤 2020-03-29 13:40:42

同学你好,结果是随机的,如下所示运行12次。同学不需要在意具体运行了几次。

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

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

好帮手慕小尤 2020-03-29 11:44:18

同学你好,当创建多个线程对象时,三个对象同时去抢占cup,进行执行线程,则线程输出内容是随机的。但此线程会循环十次,当检测到一共执行到10次时,则会结束线程。

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

  • 提问者 苍星乱舞 #1
    我多次实验都是循环十一次呀?
    2020-03-29 12:22:41
  • 木子宝 回复 提问者 苍星乱舞 #2
    应该是cpu时间片轮转速度远大于一条语言的执行过程,循环中i++本身就是最后执行的,大概率会出现其中一个或两个线程获取到i值还没来的及输出就让其他的线程在执行,然后之前获取的i值未执行完的线程,即使等到i=10还是会继续去执行,所以执行10-12次都应该是正常情况
    2020-04-02 10:41:40
  • 或者可以按照概率的思想去简单判断,假如一条语句的执行需要获得两个时间片(简化),那么要恰好好执行10次表示每一次都恰好执行完成了再执行下一个完成,概率是1/3*1/2=1/6.恰好执行12次,三个线程都分别先获得且只获得前半时间片,2/3*1/3=2/9.执行11次的概率就是11/18.所以执行11次是较大概率,而且当一条语句需要获取的时间片越多,执行11次的概率也越大
    2020-04-02 10:53:55
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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