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()方法,可以验证线程是否终止。