好的,我的问题可能听起来令人困惑,但实际上非常简单。 我有一个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
答案 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()来等待其线程死...
......或不。这完全取决于你。如果您的代码是为尊重父/子关系而编写的,那么您可以这样做。它实际上是一种非常常见的做法,但语言并没有强迫它。