前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java多线程中join方法的理解

Java多线程中join方法的理解

作者头像
JavaEdge
发布于 2018-05-16 08:47:14
发布于 2018-05-16 08:47:14
1.7K00
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

许多同学刚开始学Java 多线程时可能不会关主Join 这个动作,因为不知道它是用来做什么的,而当需要用到类似的场景时却有可能会说Java 没有提供这种功能。

当我们将一个大任务划分为多个小任务,多个小任务由多个线程去完成时,显然它们完成的先后顺序不可能完全一致。在程序中希望各个线程执行完成后,将它们的计算结果最终合并在一起,换句话说,要等待多个线程将子任务执行完成后,才能进行合并结果的操作。 这时就可以选择使用Join 了,Join 可以帮助我们轻松地搞定这个问题,否则就需要用个循环去不断判定每个线程的状态。

在实际生活中,就像把任务分解给多个人去完成其中的各个板块,但老板需要等待这些人全部都完成后才认为这个阶段的任务结束了,也许每个人的板块内部和别人还有相互的接口依赖,如果对方接口没有写好,自己的这部分也不算完全完成,就会发生类似于合并的动作(到底要将任务细化到什么粒度,完全看实际场景和自己对问题的理解)。下面用段简单的代码米说明Join 的使用。

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.sss.test;

import java.util.Random;

/**
 * @author Shusheng Shi
 */
public class ThreadJoinTest {
    static class Computer extends Thread {
        private int start;
        private int end;
        private int result;
        private int[] array;

        public Computer(int[] array, int start, int end) {
            this.array=array;
            this.start=start;
            this.end=end;
        }

        @Override
        public void run() {
            for (int i=start; i < end; i++) {
                result+=array[i];
            }

            if (result < 0) {
                result&=Integer.MAX_VALUE;
            }

        }

        public int getResult() {
            return result;

        }
    }

    private final static int COUNTER=10000000;

    public static void main(String[] args) throws InterruptedException {
        int[] array=new int[COUNTER];
        Random random=new Random();
        for (int i=0; i < COUNTER; i++) {
            array[i]=Math.abs( random.nextInt() );
        }
        long start=System.currentTimeMillis();
        Computer c1=new Computer( array, 0, COUNTER );
        Computer c2=new Computer( array, COUNTER / 2, COUNTER );
        c1.start();
        c2.start();
        c1.join();
        c2.join();
        System.out.println( System.currentTimeMillis() - start );
        System.out.println( (c1.getResult() + c2.getResult()) & Integer.MAX_VALUE );
    }
}

这个例子或许不太好,只是1000 万个随机数叠加,为了防此CPU计算过快,在计算中增加一些判定操作,最后再将计算完的两个值输出,也输出运算时间。如果在有多个CPU的机器上做测试,就会发现数据量大时,多个线程计算具有优势,但是这个优势非常小, 而且在数据量较小的情况下,单线程会更快些。为何单线程可能会更快呢? 最主要的原因是线程在分配时就有开销(每个线程的分配过程本身就高要执行很多条底层代码,这些代码的执行相当于很多条CPU 叠加运算的指令),Join 操作过程还有其他的各种开销。 如果尝试将每个线程叠加后做一些其他的操作,例如IO读写、字符串处理等操作,多线程的优势就出来了,因为这样总体计算下来后,线程的创建时间是可以被忽略

所以我们在考量系统的综合性能时不能就一一个点或某种测试就轻易得出一一个最终结论,定要考虑更多的变动因素。

那么使用多线程带来更多的是上下文切换的开销,多线程操作的共享对象还会有锁瓶 否则就是非线程安全的。 颈, 综合考量各种开销因素、时间、空间, 最后利用大量的场景测试来证明推理是有 指导性的,如果只是一味地为了用多线程而使用多线程,则往往很多事情可能会适得 其反 Join5 ?是语法层面的线程合并,其实它更像是当前线程处于BLOCKEN 状态时去等待 I :他线程结束的事件,而且是逐个去Join。换句话说,Join 的顺序并不一一定是线程真正结 束的顺序,要保证线程结束的顺J 字性,它还无法实现,即使在本例中它也不是唯一的实现 方式,本章后面会提到许多基于并发编程工具的方式来实现会更加理想,管理也会更加体 系化,能适应更多的业务场景需求。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA高级面试面试---多线程优化技巧与实战
多线程编程是现代软件开发中不可或缺的一部分,特别是在处理高并发场景和优化程序性能时。作为Java开发者,掌握多线程优化技巧不仅能够提升程序的执行效率,还能在面试中脱颖而出。本文将从多线程基础、线程与进程的区别、多线程的优势出发,深入探讨如何避免死锁与竞态条件、线程间的通信机制、线程池的使用优势、线程优化算法与数据结构的选择,以及硬件加速技术。通过多个Java示例,我们将揭示这些技术的底层原理与实现方法。
小马哥学JAVA
2024/12/24
1130
⚡️⚡️Java多线程编程的高效、安全实践
Java作为一门强大而广泛使用的编程语言,多线程编程是其重要的特性之一。在本文中,我们将深入探讨Java多线程编程与并发控制的方方面面。我们将从多线程的基本概念入手,了解多线程编程的优势和挑战。然后,我们会介绍Java中创建和管理线程的几种方式,并探讨如何避免常见的并发问题。通过本文的学习,将能够优雅地掌控Java多线程编程,构建高效、稳定的并发应用。
默 语
2024/11/20
1210
java 线程方法join的简单总结
在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程。但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入,由于CPU时间调度上的问题,写入数据会被多次的覆盖,所以就要使线程同步。 同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。
葆宁
2019/04/18
4310
Java多线程(下)
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
润森
2019/11/09
4200
Java多线程总结
对于进程和线程的概念可以简单的理解成一个包含关系,例如:一个人个体可以称为社会的一个进程,人可以同时做很多事情,这个称之为线程
付威
2020/01/21
5440
Fork/Join框架基本使用[通俗易懂]
ava.util.concurrent.ForkJoinPool由Java大师Doug Lea主持编写,它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。本文中对Fork/Join框架的讲解,基于JDK1.8+中的Fork/Join框架实现,参考的Fork/Join框架主要源代码也基于JDK1.8+。
全栈程序员站长
2022/07/22
3810
Fork/Join框架基本使用[通俗易懂]
JAVA多线程中join()方法的详细分析
虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像是t.join()方法会使所有线程都暂停并等待t的执行完毕。当然,这也是因为我对多线程中的各种方法和同步的概念都理解的不是很透彻。通过看别人的分析和自己的实践之后终于想明白了,详细解释一下希望能帮助到和我有相同困惑的同学。
全栈程序员站长
2022/08/10
4650
多线程编程学习七( Fork/Join 框架).
使用 java8 lambda 表达式大半年了,一直都知道底层使用的是 Fork/Join 框架,今天终于有机会来学学 Fork/Join 框架了。
JMCui
2019/09/09
5180
多线程编程学习七( Fork/Join 框架).
【JavaEE】——多线程(join阻塞,计算,引用,状态)
阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你!
三三是该溜子
2024/12/30
800
【JavaEE】——多线程(join阻塞,计算,引用,状态)
Java线程(十一):Fork/Join-Java并行计算框架
高爽
2017/12/28
9060
Java线程(十一):Fork/Join-Java并行计算框架
一个多线程异步执行面试题的多种解决方法
文章目录 1.问题 2.解决方法 2.1 线程的Join方法 2.2 共享volatile变量 2.3 synchronized锁 2.4 wait+notify/notifyAll 2.5 park/unpark 2.6 ReentrantLock可重入锁 2.7 ReentrantLock配合Condation 2.8 CountDownLatch 2.9 CyclicBarrier 2.10 Semaphore 2.11 Phaser 2.12 Exchanger 2.13 BlockingQueu
冬天里的懒猫
2021/08/31
8030
理解 Java 中的多线程编程
多线程编程是 Java 中的一个重要组成部分,它可以让程序并发地执行多个任务,从而提升应用的性能。在现代计算机中,CPU 通常有多个核心,通过多线程编程,可以更高效地利用这些核心来执行多个任务。
闻说社
2024/10/11
2260
理解 Java 中的多线程编程
【转】 Java 多线程之一
进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。
shirayner
2018/08/10
4520
Java多线程详解
每个运行的程序就是一个进程,当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个进程。
二十三年蝉
2018/08/01
8901
Java多线程详解
Java并行编程:利用多线程加速大规模任务处理
随着现代计算机中处理器核心数量的增加,利用多线程进行并行编程已经成为提升大规模任务处理速度的有效方式。在Java中,通过多线程编程可以充分利用计算资源,加速任务的执行。本文将分享Java并行编程的基本原理、常用技术和最佳实践,并结合实际代码示例,帮助您更好地理解并实践多线程加速大规模任务处理的方法,具备实际操作价值。
华科云商小彭
2023/09/28
9260
Java并行编程:利用多线程加速大规模任务处理
Java多线程学习
提醒一下大家:main方法其实也是一个线程。在java中所以的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。
谭庆波
2018/08/10
4260
Java多线程学习
Java多线程之线程安全问题
原文:https://blog.csdn.net/weixin_59383491/article/details/134952020
一百减一是零
2024/08/08
2200
杰哥教你面试之一百问系列:java中高级多线程concurrent的使用
提到多线程,当然要熟悉java提供的各种多线程相关的并发包了,而java.util.concurrent就是最最经常会使用到的,那么关于concurrent的面试题目有哪些呢?一起来看看吧。
程序那些事
2023/09/07
4060
Java 实现多线程的n种方法
在现代编程中,多线程是一项关键技术,它使得程序能够同时执行多个任务,提高了系统的效率和性能。在Java中,有多种方法可以实现多线程,每种方法都有其独特的应用场景和优缺点。本文将详细介绍几种常见的Java多线程实现方法,包括基础的Thread类、Runnable接口、高级的线程池、并发工具类、异步编程以及新的并发特性,帮助你深入理解多线程的不同实现方式。
繁依Fanyi
2024/11/22
2560
Java 多线程学习
这些动作都可以抽象为任务,虽然看起来一心二用,但人只有一个大脑,在一个时间片刻只能处理一个任务。
默 语
2024/11/20
1080
Java 多线程学习
相关推荐
JAVA高级面试面试---多线程优化技巧与实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档