日期:2014-05-20  浏览次数:20618 次

java 线程问题
Java code
public class BadThreads {

    static String message;

    private static class CorrectorThread
        extends Thread {

        public void run() {
            try {
                sleep(3000); 
            } catch (InterruptedException e) {}
            // Key statement 1:
            message = "Mares do eat oats."; 
        }
    }

    public static void main(String args[])
        throws InterruptedException {
        (new CorrectorThread()).start();
        message = "Mares do not eat oats.";
        Thread.sleep(4000);
        // Key statement 2:
        System.out.println(message);
    }
}



请问这段代码执行的顺序是怎样的?执行结果呢?

------解决方案--------------------
不同意楼上观点;
启动顺序肯定是先是主线程,就是main函数所在的线程,然后是在main函数中启动的另一个线程new CorrectorThread()).start();
在第二个线程启动之后,两个线程并行执行。所以语句执行的先后有随机性。这个随机性与睡眠的时间有关,时间相差越短,随机性越高。所以执行的结果可能是eat也可能是don't eat。但是在特定的环境下,比如楼主的主机环境下,睡眠3000和4000,可能尝试100次结果都是相同的,但是这不足以证明,这个执行顺序就是确定的,在其他环境下(比如把睡眠时间改为20),不一定这个结果。
------解决方案--------------------
探讨

不同意楼上观点;
启动顺序肯定是先是主线程,就是main函数所在的线程,然后是在main函数中启动的另一个线程new CorrectorThread()).start();
在第二个线程启动之后,两个线程并行执行。所以语句执行的先后有随机性。这个随机性与睡眠的时间有关,时间相差越短,随机性越高。所以执行的结果可能是eat也可能是don't eat。但是在特定的环境下,比如楼主的主机环境下,睡……

------解决方案--------------------
探讨

不同意楼上观点;
启动顺序肯定是先是主线程,就是main函数所在的线程,然后是在main函数中启动的另一个线程new CorrectorThread()).start();
在第二个线程启动之后,两个线程并行执行。所以语句执行的先后有随机性。这个随机性与睡眠的时间有关,时间相差越短,随机性越高。所以执行的结果可能是eat也可能是don't eat。但是在特定的环境下,比如楼主的主机环境下,睡……