`

java并发的Join解析

 
阅读更多

 当主线程调用子线程的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>

 

 

分享到:
评论

相关推荐

    java并发实战中文文档

    《Java并发实战》是一本深度剖析Java并发编程的权威指南,旨在帮助开发者高效地理解和解决多线程环境下的编程挑战。文档清晰明了,配备有详细的目录,使得学习过程更为顺畅,避免了在查找信息上浪费时间。标签“Java...

    13-Java并发编程学习宝典.zip

    —深入解析ConcurrentHashMap-慕课专栏.html" 和 "25 经典并发容器,多线程面试必备—深入解析ConcurrentHashMap下-慕课专栏.html":这两篇文章深入探讨了Java并发容器中的`ConcurrentHashMap`,它是线程安全的哈希...

    JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf

    根据提供的文件信息,“JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf”,我们可以推断出这份文档主要聚焦于Java并发编程的技术实践与理论探讨。下面将从多个角度来解析这个文档可能涵盖的关键知识点。 ...

    Java并发编程原理与实战

    Spring对并发的支持:Spring的异步任务.mp4 使用jdk8提供的lambda进行并行计算.mp4 了解多线程所带来的安全风险.mp4 从线程的优先级看饥饿问题.mp4 从Java字节码的角度看线程安全性问题.mp4 synchronized保证线程...

    探索Java并发:Future与ForkJoin框架深度解析

    ForkJoin框架 是Java 7中引入的,旨在进一步提高并发程序的性能。它使用了一种称为“工作窃取”的算法,允许线程动态地重分配任务。ForkJoin的核心思想是将大任务分解为更小的任务,然后并行处理这些任务,最后合并...

    龙果java并发编程完整视频

    第1节你真的了解并发吗? [免费观看][免费观看] 00:27:48分钟 | 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看]...

    JAVA并发编程实践-中文-高清-带书签-完整版

    最后,本书还涵盖了Java并发编程的最新发展,如Fork/Join框架和Parallel Streams,这些是Java 7及以后版本引入的新特性,能够帮助开发者充分利用多核处理器的优势,编写出高性能的并行代码。 总而言之,《JAVA并发...

    《Java并发编程实战》PDF版本下载.txt

    然而,为了满足您对于生成相关知识点的需求,我们将围绕《Java并发编程实战》这本书的内容来展开讨论,深入解析Java并发编程的核心概念、原理以及实际应用技巧。 ### Java并发编程基础 #### 1. 并发与并行的概念 -...

    Java 并发.pdf_电子版pdf版

    本篇将详细解析Java并发中的线程状态转换、线程的使用方式以及相关概念。 一、线程状态转换 Java线程在执行过程中会经历五种基本状态: 1. 新建(New):线程被创建但尚未启动。 2. 可运行(Runnable):线程可能...

    JAVA并发面试宝典

    本文档详细列举了Java并发领域面试中常见的问题,以下是对这些问题及答案的解析。 1.1 多线程和并发问题。并发是指两个或多个事件在同一时间间隔内发生,多线程是实现并发的一种方式,可以通过创建多个线程,让它们...

    龙果 java并发编程原理实战

    龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...

    java并发编程实战源码,java并发编程实战pdf,Java源码.zip

    《Java并发编程实战》是Java开发者深入理解并发编程的一本经典著作,这本书通过丰富的实例和深入的理论解析,帮助读者掌握在多线程环境中编写高效、可靠的代码。在这个压缩包中,包含了源码和PDF版的书籍内容,是...

    java 7并发编程实战手册 源码

    首先,Java并发编程的核心是线程,Java 7在多线程处理方面做了很多优化,如引入了Fork/Join框架,用于高效地执行大量计算任务。Fork/Join框架基于工作窃取算法,能将大任务拆分为小任务,通过并行执行提高性能。此外...

    Java并发编程实践

    总之,《Java并发编程实践》是一本全面解析Java并发编程的指南,它涵盖了从基础到高级的并发知识,帮助开发者构建高效、稳定的多线程应用程序。通过深入学习和实践,开发者可以更好地应对并发挑战,编写出更加健壮、...

    Java 多线程与并发-Java并发知识体系详解.pdf

    以下是对Java并发知识体系的详细解析。 首先,我们要理解并发的理论基础。并发是为了提高系统资源利用率和处理能力,让多个任务在逻辑上同时执行。线程不安全指的是在并发环境下,数据的正确性无法得到保证,可能...

    《JAVA并发编程艺术》

    《JAVA并发编程艺术》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代多核处理器环境下不可或缺的技术,它能够充分利用系统资源,提高程序的执行效率。本书旨在帮助读者从基础知识到高级技巧,...

    Java并发与高级特性面试知识点解析

    内容概要:本文详细列举并解释了一系列针对具有一定工作经验候选人的Java面试题目...其他说明:面试题覆盖范围广泛且全面阐述了Java中的并发特性和进阶主题,在加深求职者的专业知识的同时也有助于拓宽他们的思维视野。

    葛一鸣 实战java高并发程序设计 源码

    该资源“葛一鸣实战Java高并发程序设计”提供了一套完整的源码,旨在帮助开发者深入理解和实践Java并发编程的相关概念。 源码分析: 1. **线程与多线程**:Java中的线程是并发编程的基础,通过`Thread`类或实现`...

    Java 并发编程原理与实战视频

    java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...

Global site tag (gtag.js) - Google Analytics