关于执行顺序的线程和混淆

时间:2016-11-16 18:27:30

标签: java multithreading

我无法理解程序执行的顺序。

public class sub  {
    public static void main(String args[])
    {
        base b1 = new base();
        b1.s="b1";
        b1.start();
        base b2 = new base();
        b2.s="b2 ";
        b2.start();

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }  
}

public class base extends Thread{

    String s;
    @Override
    public void run() {
    for(int i=0;i<5;i++)
    {
        System.out.println(s+" "+i);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    // TODO Auto-generated method stub

}


}

输出

b2  0
b1 0
b2  1
b1 1
b2  2
b1 2
b1 3
b2  3
b2  4
b1 4

有人可以解释为什么输出按此顺序排列。为什么第一个b2在b1之前执行而在b2之前不是b1。那么为什么b1首先执行。

1 个答案:

答案 0 :(得分:0)

无法保证在另一个线程之前选择一个线程。在这种情况下,可能发生的是调度程序试图避免上下文切换,因此它将尝试保持主线程运行。此外,启动新线程需要时间。也许当主线程进入休眠状态时,b1和b2都会启动,它们首先开始运行,并且选择获取stdout打印流上的锁定,这两者都是任意选择。

相关问题