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)
很可能你得到了相同的结果,因为在大多数情况下,主线程开始一个新线程,然后在新线程有机会打印任何东西之前,主线程打印它的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很少是竞争条件的良好解决方案.我刚刚在这里用它来说明目的.