线程抢CUP的资源可以发生在run()方法的任何地方

线程抢CUP的资源可以发生在run()方法的任何地方

用一个小代码来证明

public class ThreadDemo {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	resource r = new resource();
	Output o = new Output(r);
	Input i = new Input(r);
	
	Thread t = new Thread(i);
	Thread t1 = new Thread(o);
	
	t.start();
	t1.start();
}

}

public class Input implements Runnable {
	private resource r;
	public Input(resource r) {
		this.r = r;
	}
	private int i = 0;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true){
			if(i%2==0) {
				r.name = "钱-"+i;
				r.sex = "男-"+i;
			}else {
				r.name = "mao-"+i;
				r.sex = "nv-"+i;
			}
			i++;
		}
	}
}
public class Output implements Runnable{
	private resource r;
	public Output(resource r) {
		this.r = r;
	}
	@Override
	public void run() {
		while(true){
				System.out.println(r.name+" "+r.sex);
			}
	}
}
public class resource {
	public String name;
	public String sex;
}

输出

1、mao-345 男-346
2、钱-374 nv-375
3、钱-442 nv-527
4、mao-9081 男-9080
5、mao-13615 nv-13617
6、钱-13632 nv-13631
7、mao-13647 男-13646

分析

正常情况下 姓名与性别匹配 数字相同。

非正常情况:

当前一个数字大于第二个数字时说明
r.name = “钱-”+1; r.name = “mao-”+2;
r.sex = “男-”+1; r.sex = “男-”+1;
输入线程执行两次第二次执行到name赋值后被输出线程抢走所以会有第一个数大于第二个数。

当前一个数字小于第二个数字时只能是(因为赋值都是先赋值名字在是性别,无论线程怎么抢都是这样)
System.out.println(r.name+" "+r.sex);语句输出一个名字时被输入线程抢走后在输出性别就会出现第一个数字小于第二个数字。
同时也说明线程的交替可以发生在语句还没执行完的时候,并且再次回到该线程时会在中断的地方继续开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值