📜  门| GATE-CS-2017(套装2)|问题 7(1)

📅  最后修改于: 2023-12-03 15:12:44.476000             🧑  作者: Mango

GATE-CS-2017(套装2)- 问题 7

本题要求我们分析一个Java程序的输出结果。程序如下所示:

public class ConcurrencyTest extends Thread {
    private int x;
 
    public ConcurrencyTest(int x) {
        this.x = x;
    }
 
    public static void main(String args[]) {
        ConcurrencyTest obj1 = new ConcurrencyTest(2);
        obj1.start();
        ConcurrencyTest obj2 = new ConcurrencyTest(3);
        obj2.start();
        System.out.println("Main complete");
    }
 
    public void run() {
        for(int i = 0; i < 4; i++) {
            System.out.println("Value of x: " + x + " from thread: " + Thread.currentThread().getName());
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
程序介绍

该Java程序定义了一个继承了Thread类的子类ConcurrencyTest,并定义了一个成员变量x,以及一个构造函数用于初始化变量x.在main函数中,该程序创建了两个ConcurrencyTest对象并启动了这两个对象的线程。之后在main函数中打印了一条输出语句,表示主线程已经执行完毕。而在子类ConcurrencyTest中,定义了一个run方法,该方法会输出线程名及成员变量x的值,并使线程休眠2秒钟,然后重复以上操作4次。

输出结果

程序的输出结果为:

Main complete
Value of x: 3 from thread: Thread-1
Value of x: 2 from thread: Thread-0
Value of x: 2 from thread: Thread-0
Value of x: 3 from thread: Thread-1
Value of x: 3 from thread: Thread-1
Value of x: 2 from thread: Thread-0
Value of x: 2 from thread: Thread-0
Value of x: 3 from thread: Thread-1

其中,程序首先输出了"Main complete",表示主线程已经执行完毕。之后,两个线程交替输出了各自的成员变量x的值和线程名。

分析和解释

通过分析程序,我们可以得知该Java程序是一个多线程程序。在程序中,主线程和ConcurrencyTest子类对象的线程会同时执行。启动子类线程之后,主线程并不会等待子类线程执行完毕,而是直接输出"Main complete"语句,然后继续执行。

在子类ConcurrencyTest的run方法中,我们可以看到在输出成员变量x和线程名之后,该线程会休眠2秒钟,然后重复输出。

由于程序中创建了两个ConcurrencyTest对象并启动了两个线程,因此两个线程会交替执行。可以看到,先输出了线程名为Thread-1的线程对象的x值为3,然后是线程名为Thread-0的线程对象的x值为2,接着又输出了Thread-0线程对象的x值为2和Thread-1线程对象的x值为3。证明了两个线程是交替执行的。

由于线程的执行顺序是不确定的,并且在输出时线程会休眠2秒钟,因此每次执行程序的输出结果可能会有所不同。

总结

本题中的Java程序是一个多线程程序,主线程和子类线程并发执行。程序中创建了两个线程对象并启动了两个线程,两个线程会交替执行,并且在输出时会因为线程休眠2秒而导致输出结果的不确定性。