Java多线程学习笔记 - 六、使用Thread.join()方法
2023-09-14 09:01:36 时间
一、概述
与 wait()和notify() 方法一样,join()是另一种线程间同步机制。
当调用join()方法时,调用线程进入等待状态。它一直处于等待状态,直到被调用的线程终止。
二、Thread.join()方法
参考代码
class SampleThread extends Thread {
public int processingCount = 0;
public SampleThread(int processingCount) {
this.processingCount = processingCount;
LOGGER.info("Thread Created");
}
@Override
public void run() {
LOGGER.info("Thread " + this.getName() + " started");
while (processingCount > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
LOGGER.info("Thread " + this.getName() + " interrupted");
}
processingCount--;
}
LOGGER.info("Thread " + this.getName() + " exiting");
}
}
@Test
void test_join()
{
Thread t2 = new SampleThread(1);
t2.start();
System.out.println("Invoking join");
try {
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Returned from join");
System.out.println(t2.isAlive());
}
输出如下
Thread Created Invoking join Thread Thread-2 started Thread Thread-2 exiting Returned from join false
如果引用的线程被中断,join()方法也可能返回。在这种情况下,该方法抛出一个 InterruptedException。
最后,如果引用的线程已经终止或尚未启动,则调用join()方法会立即返回。
三、带超时的Thread.join()方法
如果引用的线程被阻塞或处理时间过长,join() 方法将继续等待。因为调用线程将变得无响应。 为了处理这些情况,我们使用允许我们指定超时时间的 join() 方法的重载版本。
有两个重载 join() 方法的定时版本:
public final void join(long millis) throws InterruptedException
public final void join(long millis,int nanos) throws InterruptedException
测试代码
@Test
public void waitsUntilTimedout()
throws InterruptedException {
Thread t3 = new SampleThread(10);
t3.start();
t3.join(1000);
assertTrue(t3.isAlive());
}
在这种情况下,调用线程等待大约 1 秒以等待线程 t3 完成。如果线程 t3 在此时间段内未完成,则join()方法将控制权返回给调用方法。
Timed join()取决于操作系统的计时。不一定等于我们等待指定的时间。
相关文章
- java除法保留两位小数_JAVA除法保留小数点后两位的两种方法
- java 四舍五入运算_JAVA正确的四舍五入方法「建议收藏」
- java中打印数组的方法_Java数组方法–如何在Java中打印数组
- java 实现 按位异或_Java 按位异或的性质及其妙用
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- eclipse运行java程序_如何在Eclipse中运行简单的Java程序?「建议收藏」
- java dom4j生成xml格式化_Java DOM4J方式生成XML的方法「建议收藏」
- java验证手机号正则表达式_Java使用正则表达式验证手机号和电话号码的方法「建议收藏」
- java 文件上传到服务器_Java上传文件到服务器端的方法「建议收藏」
- Java 8 的 java.util.function.* POJO 的反射新方法
- java url加密_Java实现url加密处理的方法示例
- java mutator,Java – 使用Accessor和Mutator方法「建议收藏」
- JAVA多线程总结
- java多线程面试题整理及答案(2018年)详解编程语言
- Java多线程超详解编程语言
- 解决Linux下重启Java程序的方法(linux重启java)
- 程序Linux命令调用Java程序实现交互(linux命令java)
- 如何在Linux系统下成功安装Java?(linux下安装java)
- Java与MySQL的无缝衔接:实现高效数据操作(java中使用mysql)
- Java工程师集MySQL技能于一身(java工程师mysql)
- java多线程编程之从线程返回数据的两种方法
- java多线程编程之使用Synchronized块同步方法