Java Thread类的join()方法(附带实例)
在现实生活中,经常能碰到“插队”的情况,同样,Java 的 Thread 类中也提供了一个 join() 方法来实现这个功能。
join() 方法的作用是进行线程插队,也就是说,调用 join() 方法的线程相对于调用它的上级线程拥有更高的执行权。调用join() 方法的线程的上级线程必须等待调用 join() 方法的线程执行完成才能继续执行。
Java 提供了如下 3 个重载的 join() 方法。
下面演示 join() 方法的用法,其中,主线程通过 join() 方法实现流程控制,保证主线程能够执行到最后,同时控制第三个线程在第一个线程死亡后再启动。
【实例】join() 方法的用法。
join() 方法的作用是进行线程插队,也就是说,调用 join() 方法的线程相对于调用它的上级线程拥有更高的执行权。调用join() 方法的线程的上级线程必须等待调用 join() 方法的线程执行完成才能继续执行。
Java 提供了如下 3 个重载的 join() 方法。
- public final void join():使当前线程处于等待状态,直到调用它的线程死亡。如果线程被中断,那么抛出 InterruptedException 异常。
- public final synchronized void join(long millis):用于等待调用该方法的线程终止或等待指定的毫秒。由于线程执行依赖操作系统实现,因此不保证当前线程只等待给定时间。
- public final synchronized void join(long millis, int nanos):用于等待线程死亡或等待指定的毫秒加纳秒。
下面演示 join() 方法的用法,其中,主线程通过 join() 方法实现流程控制,保证主线程能够执行到最后,同时控制第三个线程在第一个线程死亡后再启动。
【实例】join() 方法的用法。
public class Demo {
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunner2(), "t1");
Thread t2 = new Thread(new MyRunner2(), "t2");
Thread t3 = new Thread(new MyRunner2(), "t3");
t1.start();
// 主线程等待t1线程死亡或等待2秒后向下执行启动t2线程
try {
t1.join(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
// 主线程等待t1线程死亡后再向下执行启动t3线程
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
t3.start();
// 主线程等待t1线程、t2线程和t3线程死亡后再向下执行
try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("All threads are dead, exiting main thread");
}
}
class MyRunner2 implements Runnable {
@Override
public void run() {
System.out.println("Thread started:::" + Thread.currentThread().getName());
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread ended::" + Thread.currentThread().getName());
}
}
运行结果为:
Thread started:::t1
Thread started:::t2
Thread ended::t1
Thread started:::t3
Thread ended::t2
Thread ended::t3
All threads are dead, exiting main thread
ICP备案:
公安联网备案: