Java中的isAlive()和join()方法

时间:2020-01-09 10:35:08  来源:igfitidea点击:

在应用程序中,我们可能会遇到这样的情况:我们生成一堆线程来执行某些逻辑,并且只想在所有线程完成执行后才开始任何进一步的处理。这意味着我们需要某种方式来知道线程是否终止。为此,Thread类在Java中提供了isAlive()和join()方法来检查线程是否已完成执行。

Java中的isAlive()方法

此方法测试该线程是否仍然存在。如果线程已经启动但尚未死亡,则该线程是活动的。如果线程处于活动状态,则方法返回true,否则返回false。

isAlive()方法语法

public final boolean isAlive()

Java中的join()方法

该方法等待,直到调用该方法的线程终止。 Java Thread类中有三个重载版本的join()方法。

  • public final void join()引发InterruptedException –无限期等待此线程死亡。
  • public final void join(long millis)引发InterruptedException –最多等待此线程死亡的时间(以毫秒为单位)。
  • 公共最终无效连接(long millis,int纳米)会抛出InterruptedException –最多等待该毫秒数的时间(以毫秒为单位)再加上额外的时间(以纳秒为单位),以使该线程死亡。

isAlive()和join()方法的Java示例

这是一个示例,其中创建了五个线程,并且我们想确保仅在所有这五个线程完成执行run()方法并且终止所有这五个线程之后,才进行进一步的处理。

首先,我们将看到如果不使用join()方法会发生什么。

class MyRunnable implements Runnable{
  @Override
  public void run() {
    System.out.println("In run method --" + Thread.currentThread().getName());	
    try {
      Thread.sleep(500);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }	
}

public class ThreadDemo {

  public static void main(String[] args) {
    Thread t1 = new Thread(new MyRunnable());
    Thread t2 = new Thread(new MyRunnable());
    Thread t3 = new Thread(new MyRunnable());
    Thread t4 = new Thread(new MyRunnable());
    Thread t5 = new Thread(new MyRunnable());

    t1.start();
    t2.start();
    t3.start();
    t4.start();
    t5.start();

    System.out.println("Is t1 Alive " + t1.isAlive());
    System.out.println("Is t2 Alive " + t2.isAlive());
    System.out.println("Is t3 Alive " + t3.isAlive());
    System.out.println("Is t4 Alive " + t4.isAlive());
    System.out.println("Is t5 Alive " + t5.isAlive());

    System.out.println("Now start further processing");
  }
}

输出:

Is t1 Alive true
Is t2 Alive true
Is t3 Alive true
Is t4 Alive true
Is t5 Alive true
Now start further processing
In run method --Thread-1
In run method --Thread-0
In run method --Thread-2
In run method --Thread-3
In run method –Thread-4

从输出中可以看到,即使在线程开始执行之前,也会显示"现在开始进一步处理"消息。但这不是我们想要的,因此让我们看看join()方法如何在这种情况下提供帮助。

class MyRunnable implements Runnable{
  @Override
  public void run() {
    System.out.println("In run method --" + Thread.currentThread().getName());	
    try {
      Thread.sleep(500);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }	
}

public class ThreadDemo {

  public static void main(String[] args) {
    Thread t1 = new Thread(new MyRunnable());
    Thread t2 = new Thread(new MyRunnable());
    Thread t3 = new Thread(new MyRunnable());
    Thread t4 = new Thread(new MyRunnable());
    Thread t5 = new Thread(new MyRunnable());
    
    t1.start();
    t2.start();
    t3.start();
    t4.start();
    t5.start();
        
    System.out.println("Is t1 Alive " + t1.isAlive());
    System.out.println("Is t2 Alive " + t2.isAlive());
    System.out.println("Is t3 Alive " + t3.isAlive());	
    System.out.println("Is t4 Alive " + t4.isAlive());
    System.out.println("Is t5 Alive " + t5.isAlive());
    try {
      t1.join();
      t2.join();
      t3.join();
      t4.join();
      t5.join();
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
        
    System.out.println("Is t1 Alive " + t1.isAlive());
    System.out.println("Is t2 Alive " + t2.isAlive());
    System.out.println("Is t3 Alive " + t3.isAlive());
    System.out.println("Is t4 Alive " + t4.isAlive());
    System.out.println("Is t5 Alive " + t5.isAlive());

    System.out.println("Now start further processing");
  }
}

输出:

Is t1 Alive true
In run method --Thread-2
In run method --Thread-0
In run method --Thread-3
Is t2 Alive true
Is t3 Alive true
Is t4 Alive true
Is t5 Alive true
In run method --Thread-4
In run method --Thread-1
Is t1 Alive false
Is t2 Alive false
Is t3 Alive false
Is t4 Alive false
Is t5 Alive false
Now start further processing

如我们所见,仅在所有五个线程执行完毕后,现在显示"现在开始进一步处理"消息。在join()方法之后使用isAlive()方法,可以验证线程是否终止。