当主线程调用子线程的join方法时,主线程进入wait,等待子线程结束或者超过等待时间,然后主线程和子线程又进入了各自的抢占模式。
public class TestJoin implements Runnable { @Override public void run() { // synchronized (currentThread()) { for (int i = 1; i <= 5; i++) { try { sleep(1000);//睡眠5秒,循环是为了方便输出信息 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("睡眠" + i); } System.out.println("TestJoin finished");//t线程结束 } //} public static void main(String[] sure) throws InterruptedException { Thread t = new Thread(new TestJoin()); long start = System.currentTimeMillis(); t.start(); t.join(3000);//等待线程t 3000毫秒 Long interval = System.currentTimeMillis()-start; System.out.println("Main finished after " + interval);//打印主线程结束 } }
可以看到,主线程如果是t.join(3000);则先子线程会打印出3次睡眠,然后主线程等到3000秒超时后继续执行。
如果调用t.join(),不给超时间的话,则主线程会一直等待子线程结束,再继续执行。
下面是join的源码,可以看到写的很明白了“A timeout of {@code 0} means to wait forever.”
/** * Waits at most {@code millis} milliseconds for this thread to * die. A timeout of {@code 0} means to wait forever. * * <p> This implementation uses a loop of {@code this.wait} calls * conditioned on {@code this.isAlive}. As a thread terminates the * {@code this.notifyAll} method is invoked. It is recommended that * applications not use {@code wait}, {@code notify}, or * {@code notifyAll} on {@code Thread} instances. * * @param millis * the time to wait in milliseconds * * @throws IllegalArgumentException * if the value of {@code millis} is negative * * @throws InterruptedException * if any thread has interrupted the current thread. The * <i>interrupted status</i> of the current thread is * cleared when this exception is thrown. */ public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
同时看看wait(0);是怎么处理的:
public final native void wait(long timeout) throws InterruptedException;
在方法wait的注解上有这么一句话解释了如果wait(0)那就一直等着被notify,不会超时。
If
* {@code timeout} is zero, however, then real time is not taken into
* consideration and the thread simply waits until notified.
* </ul>
* {@code timeout} is zero, however, then real time is not taken into
* consideration and the thread simply waits until notified.
* </ul>
相关推荐
《Java并发实战》是一本深度剖析Java并发编程的权威指南,旨在帮助开发者高效地理解和解决多线程环境下的编程挑战。文档清晰明了,配备有详细的目录,使得学习过程更为顺畅,避免了在查找信息上浪费时间。标签“Java...
—深入解析ConcurrentHashMap-慕课专栏.html" 和 "25 经典并发容器,多线程面试必备—深入解析ConcurrentHashMap下-慕课专栏.html":这两篇文章深入探讨了Java并发容器中的`ConcurrentHashMap`,它是线程安全的哈希...
根据提供的文件信息,“JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf”,我们可以推断出这份文档主要聚焦于Java并发编程的技术实践与理论探讨。下面将从多个角度来解析这个文档可能涵盖的关键知识点。 ...
Spring对并发的支持:Spring的异步任务.mp4 使用jdk8提供的lambda进行并行计算.mp4 了解多线程所带来的安全风险.mp4 从线程的优先级看饥饿问题.mp4 从Java字节码的角度看线程安全性问题.mp4 synchronized保证线程...
ForkJoin框架 是Java 7中引入的,旨在进一步提高并发程序的性能。它使用了一种称为“工作窃取”的算法,允许线程动态地重分配任务。ForkJoin的核心思想是将大任务分解为更小的任务,然后并行处理这些任务,最后合并...
第1节你真的了解并发吗? [免费观看][免费观看] 00:27:48分钟 | 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看]...
最后,本书还涵盖了Java并发编程的最新发展,如Fork/Join框架和Parallel Streams,这些是Java 7及以后版本引入的新特性,能够帮助开发者充分利用多核处理器的优势,编写出高性能的并行代码。 总而言之,《JAVA并发...
然而,为了满足您对于生成相关知识点的需求,我们将围绕《Java并发编程实战》这本书的内容来展开讨论,深入解析Java并发编程的核心概念、原理以及实际应用技巧。 ### Java并发编程基础 #### 1. 并发与并行的概念 -...
本篇将详细解析Java并发中的线程状态转换、线程的使用方式以及相关概念。 一、线程状态转换 Java线程在执行过程中会经历五种基本状态: 1. 新建(New):线程被创建但尚未启动。 2. 可运行(Runnable):线程可能...
本文档详细列举了Java并发领域面试中常见的问题,以下是对这些问题及答案的解析。 1.1 多线程和并发问题。并发是指两个或多个事件在同一时间间隔内发生,多线程是实现并发的一种方式,可以通过创建多个线程,让它们...
龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...
《Java并发编程实战》是Java开发者深入理解并发编程的一本经典著作,这本书通过丰富的实例和深入的理论解析,帮助读者掌握在多线程环境中编写高效、可靠的代码。在这个压缩包中,包含了源码和PDF版的书籍内容,是...
首先,Java并发编程的核心是线程,Java 7在多线程处理方面做了很多优化,如引入了Fork/Join框架,用于高效地执行大量计算任务。Fork/Join框架基于工作窃取算法,能将大任务拆分为小任务,通过并行执行提高性能。此外...
总之,《Java并发编程实践》是一本全面解析Java并发编程的指南,它涵盖了从基础到高级的并发知识,帮助开发者构建高效、稳定的多线程应用程序。通过深入学习和实践,开发者可以更好地应对并发挑战,编写出更加健壮、...
以下是对Java并发知识体系的详细解析。 首先,我们要理解并发的理论基础。并发是为了提高系统资源利用率和处理能力,让多个任务在逻辑上同时执行。线程不安全指的是在并发环境下,数据的正确性无法得到保证,可能...
《JAVA并发编程艺术》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代多核处理器环境下不可或缺的技术,它能够充分利用系统资源,提高程序的执行效率。本书旨在帮助读者从基础知识到高级技巧,...
内容概要:本文详细列举并解释了一系列针对具有一定工作经验候选人的Java面试题目...其他说明:面试题覆盖范围广泛且全面阐述了Java中的并发特性和进阶主题,在加深求职者的专业知识的同时也有助于拓宽他们的思维视野。
该资源“葛一鸣实战Java高并发程序设计”提供了一套完整的源码,旨在帮助开发者深入理解和实践Java并发编程的相关概念。 源码分析: 1. **线程与多线程**:Java中的线程是并发编程的基础,通过`Thread`类或实现`...
java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...