Java并发 | 11.[方法] join( )和join( long m )等待线程执行完毕
文章目录
- 1. join( )与join( long m )概述
- 2. 与static void Thread.sleep( long m )的区别
- 3. 代码示例
1. join( )与join( long m )概述
二者的基本作用都是「让调用者等待该线程对象执行完毕」,但他们又有些许不同:
- join( long m ) 至多会让调用者等待m毫秒。若m毫秒过去线程依旧没有结束,则不再等待;
- join( ) 会让 调用者 进入 Waiting 状态,而 join( long m ) 则会进入 Timed Waiting 状态。
2. 与static void Thread.sleep( long m )的区别
- Thread.sleep( long m ) 会让调用者进入m毫秒的 Time Waiting 状态,等待时间是固定的;
- t1.join( ) 会让调用者进入 Waiting 状态,等待时间不固定;
- t1.join( long m ) 会让调用者进入 至多m毫秒 的 Time Waiting 状态,但等待时间不固定,一旦t1执行完毕就会结束等待。
3. 代码示例
Thread t1 = new Thread(()->{
try{
Thread.sleep(10 * 1000);
} catch (InterruptedException e){
e.printStackTrace();
}
});
Thread t2 = new Thread(() -> {
try{
t1.join();
} catch (InterruptedException e){
e.printStackTrace();
}
});
// 间隔0.5s以确保t1先启动
t1.start();
Thread.sleep(500);
t2.start();
// 等待0.5s确保t2线程已执行"t1.join()"
Thread.sleep(500);
System.out.println(t2.getState()); // Waiting