在Runnable中启动Runnable?

时间:2014-07-11 17:02:50

标签: java multithreading

好的,我的问题可能听起来令人困惑,但实际上非常简单。 我有一个Runnable启动另一个Runnable实例。 所以基本上:

runnable1 - > runnable2

只要runnable2处于活动状态,runnable1是否保持活动状态,或者runnable2启动时runnable1是否完成?

Runnable runnable1;
Runnable runnable2;

runnable1 = new Runnable()
    {
        public void run()
        {
            runnable2 = new Runnable()
            {
                public void run()
                {
                    //Code here
                }
            };
            (new Thread(runnable2)).start();//Now that runnable 2 is started, does runnable 1 temrinate??
        }
    };

(new Thread(runnable1)).start();//This starts first

3 个答案:

答案 0 :(得分:4)

Thread与启动它的代码无关。因此,在您的代码中,即使runnable2仍在运行,Thread执行runnable1也会在run()结束后停止。

如果那不是您想要的,那么您应该在另一个帖子上使用Thread.join()

答案 1 :(得分:4)

简短的回答是否定的。

答案很长。 线程独立执行。 就像您使用main方法并在其中开始thread一样,main方法只会调用start而continue线程将独立运行。

如果你想让runnable1等到runnable2完成。您可以使用join()

更清楚

  

"只要runnable2还活着,runnable1就会保持活着状态   runnable1在runnable2启动时完成?"

,要么不正确,要取决于哪个线程首先获得CPU时间。

答案 2 :(得分:1)

不是答案(其他人已经这样做了)但是......

...你说" Runanble"但你的问题确实是关于线程的。 Runnable是一个界面。如果对象实现Runnable,则仅表示该对象具有public void run()方法。它并不意味着任何其他。如果它是你编写的一个类,那么run()方法将执行你所写的操作,仅此而已,而且不会少。

如果你将Runnable对象提供给一个新线程,然后你调用线程的start()函数,这就是事情变得有趣的地方。但在我开始之前,了解线程(小t)和Thread(大T)对象之间的区别非常重要。一个小t线程是通过程序代码执行的独立路径。 big-T Thread是一个Java库对象,可用于创建和管理一个小的线程。

在调用t.start()之前,little-t线程不存在。一旦它启动,它将进行一些初始化,然后它将调用你的run()方法,然后如果你的run()方法返回,它将在它不再存在之前做一些清理。


正如其他答案已经提到的那样,Java语言无法识别线程之间的任何类型的父/子关系。当一些Thread对象t存在时,碰巧知道它的任何其他线程都可以通过调用t.join()来等待其线程死...

......或不。这完全取决于你。如果您的代码是为尊重父/子关系而编写的,那么您可以这样做。它实际上是一种非常常见的做法,但语言并没有强迫它。