从我在这里阅读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语句来查看程序的流程)
答案 0 :(得分:10)
在你的例子中没有自己加入的线程。
示例中的main()线程创建一个新线程,然后它加入新线程。
不要将Thread
(即java对象)与线程(执行代码)混淆。所有方法都属于同一个Thread
对象,但它们运行在两个不同的线程。
答案 1 :(得分:4)
詹姆斯是正确的(+1来自我),我只是想让它更明确。以下是发生的事情:
您的主线程构造startinginconstructor
构造函数。
构造函数调用start,这将导致startinginconstructor对象在新线程中具有run方法。
之后主线程将继续调用makeitso。在makeit中,this
是startinginconstructor对象,因此结果是主线程等待,直到startinginconstructor对象表示的线程完成。
Java对象可以被任何线程调用,只是因为对象扩展Thread并不意味着该方法的任何调用都发生在该线程上。