如果线程调用join()本身会发生什么

时间:2016-06-24 13:00:15

标签: java multithreading join wait

从我在这里阅读Thread join on itself;

当连接方法被调用时,它应该永远等待

我目前正在准备ocajp 8认证,通过转储,当我得到这个问题时,我认为主要应该永远等待

     public class startinginconstructor extends Thread
    {
        private int x=2;
        startinginconstructor()
        {   
            start();
        }
        public static void main(String[] args) throws Exception
        {
        new startinginconstructor().makeitso(); 
        }
        public void makeitso() throws Exception
        {
            x=x-1;
            System.out.println(Thread.currentThread().getName()+" about to call join ");
            join();
            System.out.println(Thread.currentThread().getName()+" makeitso completed "); 

           //  above line shouldn't be executed (method shouldn't be completed as well )since it joined on itself..?

        }
        public void run()
        {
    System.out.println(Thread.currentThread().getName()+" run started ");
        x*=2;
    System.out.println(Thread.currentThread().getName()+" run about to complete ");  
        }
    }

程序以以下输出结束

main about to call join
Thread-0 run started
Thread-0 run about to complete
main makeitso completed

我错误地得到了线程永远等待的含义,还是我缺少的东西

  

注意:我知道从构造函数开始的线程不是推荐的做法..这是转储中的确切问题所以我只是粘贴它(*实际上并不是很精确,我已经放置了println语句来查看程序的流程)

2 个答案:

答案 0 :(得分:10)

在你的例子中没有自己加入的线程。

示例中的main()线程创建一个新线程,然后它加入新线程。

不要将Thread(即java对象)与线程(执行代码)混淆。所有方法都属于同一个Thread对象,但它们运行在两个不同的线程

答案 1 :(得分:4)

詹姆斯是正确的(+1来自我),我只是想让它更明确。以下是发生的事情:

您的主线程构造startinginconstructor构造函数。

构造函数调用start,这将导致startinginconstructor对象在新线程中具有run方法。

之后主线程将继续调用makeitso。在makeit中,this是startinginconstructor对象,因此结果是主线程等待,直到startinginconstructor对象表示的线程完成。

Java对象可以被任何线程调用,只是因为对象扩展Thread并不意味着该方法的任何调用都发生在该线程上。