线程抢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);语句输出一个名字时被输入线程抢走后在输出性别就会出现第一个数字小于第二个数字。
同时也说明线程的交替可以发生在语句还没执行完的时候,并且再次回到该线程时会在中断的地方继续开始。