java中的线程连接

java中的线程连接,java,multithreading,Java,Multithreading,(Thread)A.join()-使当前线程等待线程A完成。 然后我假设从run方法调用this.join()会导致线程死锁——它将等待自己完成。然而,这并没有发生——代码编译和运行都很好——没有死锁。当我调用this.join()时会发生什么 我的示例不是这样做的。此代码在当前线程上联接,导致其死锁: public class ThreadJoinTest { public static void main(String[] args) throws Exception { S

(Thread)A.join()
-使当前线程等待线程A完成。
然后我假设从run方法调用
this.join()
会导致线程死锁——它将等待自己完成。然而,这并没有发生——代码编译和运行都很好——没有死锁。当我调用this.join()时会发生什么

我的示例不是这样做的。此代码在当前线程上联接,导致其死锁:

public class ThreadJoinTest
{
  public static void main(String[] args) throws Exception
  {
    System.out.println("joining");
    Thread.currentThread().join();
    System.out.println("i'm back"); // we never get to this point
  }
}
您可以尝试添加

System.out.println("current thread name=" + Thread.currentThread().getName() );
要验证当前线程是否是您认为的线程,请访问您的代码。

OP在提供的示例中使用此.join()

Nathan在他的示例中使用Thread.currentThread().join()代替

通过使用this.join()可以创建一个新线程,该线程正在被连接,但主线程是完整的

@内森 按计划进行以下工作:

public class Main extends Thread {

    @Override
    public synchronized void run() {
       super.run();
       try {
           this.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
    } 

    public static void main(String[] args) {
        new Main().start();
        System.out.println("hello");
    }
}

你能提供你的代码吗?根据Java文档和这里的其他几个问题,对自身调用
join()
的线程应该无限挂起。我不明白这是怎么可能的。如果您查看grepcode()上Thread.java的源代码,您将看到它在一个while(isAlive()){wait();}循环中旋转,其中isAlive是一个本机方法。我尝试创建一个线程并使用this.join,它仍然会死锁。我不知道OP是怎么得到她的结果的。+1-@Pitelk的解释是站得住脚的。(并且向下投票者是不正确的。)但是start方法中的这个.join()应该永远阻塞,不是吗?这里把join放在start方法中是不同的。将this.join放入run方法块中。在start中,它不会阻塞,因为运行start方法的线程与正在启动的线程不同;是的,那是正确的!join()只在线程启动后才会阻塞…是的,但这与OP对非死锁情况的描述有细微的不同。