竞争状态中的第二个线程在哪里?

时间:2014-08-05 02:41:58

标签: java multithreading race-condition

以下示例来自一本解释竞争条件的书。该示例表明它有2个线程。我只能看到实现的1个线程,即Thread lo = new Race0();。有人可以帮我理解这个程序吗?我是多线程环境的新手。

第一个被调用的线程在哪里?

Race0:

class Race0 extends Thread {
    static Shared0 s;
    static volatile boolean done = false;
    public static void main(String[] x) {
        Thread lo = new Race0();
        s = new Shared0();
        try {
            lo.start();
            while (!done) {
                s.bump();
                sleep(30);
            }
            lo.join();
        } catch (InterruptedException e) {
            return;
        }
    }
    public void run() {
        int i;
        try {
            for (i = 0; i < 1000; i++) {
                if (i % 60 == 0)
                    System.out.println();
                System.out.print(“.X”.charAt(s.dif()));
                sleep(20);
            }
            System.out.println();
            done = true;
        } catch (InterruptedException e) {
            return;
        }
    }
}

Shared0:

class Shared0 {
    protected int x = 0, y = 0;
    public int dif() {
        return x - y;
    }
    public void bump() throws InterruptedException {
        x++;
        Thread.sleep(9);
        y++;
    }
}

1 个答案:

答案 0 :(得分:6)

一个线程是运行main方法的主线程,另一个线程是它实例化并启动的线程(Thread lo = new Race0();)。

java程序首先在主线程中执行main方法。

该程序创建第二个线程lo,启动线程(通过调用lo.start();),然后运行循环。

此时主线程正在运行循环:

        while (!done) {
            s.bump();
            sleep(30);
        }

同时,第二个帖子lo正在执行其run方法:

    try {
        for (i = 0; i < 1000; i++) {
            if (i % 60 == 0)
                System.out.println();
            System.out.print(“.X”.charAt(s.dif()));
            sleep(20);
        }
        System.out.println();
        done = true;
    } catch (InterruptedException e) {
        return;
    }