关于Java Thread的问题,输出一致

ran*_*psp 5 java multithreading

在下面的代码中,答案始终是开始0 1 2 3完成.我只是想知道它是如何可能的.

如果有人可以帮助提高输出的一致性,那就太好了

public class TestOne extends Thread {

/**
 * @param args
 */
public static void main(String[] args)throws Exception {
    // TODO Auto-generated method stub

    Thread t = new Thread(new TestOne());
    t.start();
    System.out.println("started");
    t.join();
    System.out.println("Complete");




}

public void run(){
    for(int i=0;i<4;i++){
        System.out.println(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 8

很可能你得到了相同的结果,因为在大多数情况下,主线程开始一个新线程,然后在新线程有机会打印任何东西之前,主线程打印它的started消息.将join在主线程,然后迫使它等待另一个线程完成,然后打印Complete.

你这里有竞争条件.在你开始第二个线程的那一刻,关于线路将被输出的顺序是不确定的(除了complete通过wait调用确定的线路之外,如前所述).

但竞争条件并不能保证您在多次运行中获得不同的结果,只有这样才有可能.当然,你仍然不应该依赖这种行为.

例如,以下代码:

public class TestOne extends Thread {
    public static void main (String[] args) throws Exception {
        Thread t = new Thread (new TestOne());
        t.start();

        Thread.sleep (1000);  // <- Added this.

        System.out.println ("Started");
        t.join();
        System.out.println ("Complete");
    }

    public void run() {
        for (int i = 0; i < 4; i++) {
            System.out.println (i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

将输出:

0
1
2
3
Started
Complete
Run Code Online (Sandbox Code Playgroud)

虽然,即使这样,订单也不能得到保证,因为线程"热身"可能需要一秒多的时间 - sleep很少是竞争条件的良好解决方案.我刚刚在这里用它来说明目的.