主题:[原创]SCJP考试试题解析十四
SCJP考试试题解析十四
我的QQ号:2535279
www.javaedu.com.cn
public class Threads1 {
int x = 0;
public class Runner implements Runnable {
public void run() {
int current = 0;
for (int i = 0; i < 4; i++) {
current = x;
System.out.print(current + ", ");
x = current + 2;
}
}
}
public static void main(String[] args) {
new Threads1().go();
}
public void go() {
Runnable r1 = new Runner();
new Thread(r1).start();
new Thread(r1).start();
}
}
Which two are possible results?(choose two)
A 0,2,4,4,6,8,10,6
B 0,2,4,6,8,10,2,4
C 0,2,4,6,8,10,12,14
D 0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14
E 0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14
面对这道题的时候,我真的不知道该怎么和大家来讲了.
首先,在go()方法中,有两条new Thread(r1).start();语句,所以,run()方法被执行了两次,总共会被打印出八个数字.排除了答案D和E
其次,我们来分析一下这个程序,在go()方法中有会产生两个线程,两个线程共享一个x变量.
A 我们这样来假设,0,2,4是由第一个线程来打印出来的,当第一个线程打印完4,还没有执行x = current + 2;时,CPU被线程二抢走.此时,x=4,线程一的current=4.线程二抢到CPU后,由x=4开始循环四次,打印出4,6,8,10.线程二完成任务后,释放CPU.线程一有机会再次使用CPU,它由断点接着执行,即x = current + 2,线程一的current=4,所以,x=6.打印出来,循环结束.
看了答案A的解析,我想大家应该也就明白了,这个程序的目的何在了,就是让我们大家假设线程可能会以哪种顺序抢占CPU,而得到不同的答案.答案B中,假设前面的0,2,4,6是由线程一打印出来,它释放CPU后,再由线程二执行,那么,后面就不会有2,4而应该是12,14.假设 线程一打印完0,2后,由线程二接着执行打印4,6,8,10,那么当CPU的使用权归线程一时,就会从断点接着执行,会打印出4,而不是2.无论线程一和线程二以何种顺序来抢占CPU,都不可能得到B的结果
答案C是最简单的一种情况了,即线程一得到CPU的使用权,打印0,2,4,6,线程得到CPU,接着打印出8,10,12,14,这个答案毫无悬念.
答案:A C