当我们调用thread.start()时首先调用哪个线程

时间:2015-10-16 12:16:15

标签: java multithreading

我的代码是:

    public class Child extends Thread {

        public void run(){
            synchronized (this) 
            {
                for(int i=1;i<=5;i++)
                {   
                    System.out.println("child thread");
                }
            }
        }
    }

class ThreadTest{
    public static void main(String []a) {
        Child child=new Child();
        **child.start();**      
        synchronized (child) 
        {
            for(int i=1;i<=5;i++)
            {   
                System.out.println("parent thread");
            }
        }
    }
}

它首先打印“父线程”之后打印“子线程”,但我怀疑是,当我们调用start()方法时,有机会在主线程之前调用子线程。但它总是在“子线程”之后打印“父线程”。可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

child.start()调用内的某个地方(即,在start()返回之前),新线程被创建,并且它有资格运行。从那时起,这是一场比赛,看看哪个线程将首先到达它的各个synchronized(...)块。没有办法知道哪一个会赢,而且没有理由认为它每次都会成为同一个赢家。

P.S。:同步Thread对象并不是一个好主意。 Thread类也会在Thread个实例上同步它们,并且存在使用Thread对象作为锁可能会干扰Thread类使用它的风险。

一个好习惯是在私人对象上进行同步。

class MyClass {
    private final Object myLock = new Object();

    SomeType someMethod(...) {
        synchronized(myLock) {
            ....
         }
    }
}