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