返回顶部
首页 > 资讯 > 精选 >JAVA多线程中join()方法怎么用
  • 703
分享到

JAVA多线程中join()方法怎么用

2023-06-15 03:06:06 703人浏览 八月长安
摘要

小编给大家分享一下JAVA多线程中join()方法怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正

小编给大家分享一下JAVA多线程中join()方法怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像是t.join()方法会使所有线程都暂停并等待t的执行完毕。当然,这也是因为我对多线程中的各种方法和同步的概念都理解的不是很透彻。通过看别人的分析和自己的实践之后终于想明白了,详细解释一下希望能帮助到和我有相同困惑的同学。

首先给出结论:t.join()方法只会使主线程(或者说调用t.join()的线程)进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。

下面则是分析过程。

之前对于join()方法只是了解它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程。能够使得线程之间的并行执行变成串行执行。

package CSDN;public class TestJoin {  public static void main(String[] args) throws InterruptedException {  // TODO Auto-generated method stub  ThreadTest t1=new ThreadTest("A");  ThreadTest t2=new ThreadTest("B");  t1.start();  t2.start(); }  }class ThreadTest extends Thread { private String name; public ThreadTest(String name){  this.name=name; } public void run(){  for(int i=1;i<=5;i++){    System.out.println(name+"-"+i);  }   }}

运行结果:

A-1
B-1
B-2
B-3
A-2
B-4
A-3
B-5
A-4
A-5

可以看出A线程和B线程是交替执行的。

而在其中加入join()方法后(后面的代码都略去了ThreadTest类的定义)

package CSDN;public class TestJoin {  public static void main(String[] args) throws InterruptedException {  // TODO Auto-generated method stub  ThreadTest t1=new ThreadTest("A");  ThreadTest t2=new ThreadTest("B");  t1.start();  t1.join();  t2.start(); }}

运行结果:

A-1
A-2
A-3
A-4
A-5
B-1
B-2
B-3
B-4
B-5

显然,使用t1.join()之后,B线程需要等A线程执行完毕之后才能执行。需要注意的是,t1.join()需要等t1.start()执行之后执行才有效果,此外,如果t1.join()放在t2.start()之后的话,仍然会是交替执行,然而并不是没有效果,这点困扰了我很久,也没在别的博客里看到过。

为了深入理解,我们先看一下join()的源码

    public final void join() throws InterruptedException {        join(0);            //join()等同于join(0)    }        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);           //join(0)等同于wait(0),即wait无限时间直到被notify            }        } else {            while (isAlive()) {                long delay = millis - now;                if (delay <= 0) {                    break;                }                wait(delay);                now = System.currentTimeMillis() - base;            }        }    }

可以看出,join()方法的底层是利用wait()方法实现的。可以看出,join方法是一个同步方法,当主线程调用t1.join()方法时,主线程先获得了t1对象的,随后进入方法,调用了t1对象的wait()方法,使主线程进入了t1对象的等待池,此时,A线程则还在执行,并且随后的t2.start()还没被执行,因此,B线程也还没开始。等到A线程执行完毕之后,主线程继续执行,走到了t2.start(),B线程才会开始执行。

此外,对于join()的位置和作用的关系,我们可以用下面的例子来分析

package CSDN; public class TestJoin {  public static void main(String[] args) throws InterruptedException {  // TODO Auto-generated method stub  System.out.println(Thread.currentThread().getName()+" start");  ThreadTest t1=new ThreadTest("A");  ThreadTest t2=new ThreadTest("B");  ThreadTest t3=new ThreadTest("C");  System.out.println("t1start");  t1.start();  System.out.println("t2start");  t2.start();  System.out.println("t3start");  t3.start();  System.out.println(Thread.currentThread().getName()+" end"); } }

运行结果为

main start
t1start
t1end
t2start
t2end
t3start
t3end
A-1
A-2
main end
C-1
C-2
C-3
C-4
C-5
A-3
B-1
B-2
B-3
B-4
B-5
A-4
A-5

A、B、C和主线程交替运行。加入join()方法后

package CSDN; public class TestJoin {  public static void main(String[] args) throws InterruptedException {  // TODO Auto-generated method stub  System.out.println(Thread.currentThread().getName()+" start");  ThreadTest t1=new ThreadTest("A");  ThreadTest t2=new ThreadTest("B");  ThreadTest t3=new ThreadTest("C");  System.out.println("t1start");  t1.start();  System.out.println("t1end");  System.out.println("t2start");  t2.start();  System.out.println("t2end");  t1.join();  System.out.println("t3start");  t3.start();  System.out.println("t3end");  System.out.println(Thread.currentThread().getName()+" end"); } }

运行结果:

main start
t1start
t1end
t2start
t2end
A-1
B-1
A-2
A-3
A-4
A-5
B-2
t3start
t3end
B-3
main end
B-4
B-5
C-1
C-2
C-3
C-4
C-5

多次实验可以看出,主线程在t1.join()方法处停止,并需要等待A线程执行完毕后才会执行t3.start(),然而,并不影响B线程的执行。因此,可以得出结论,t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。

PS:join源码中,只会调用wait方法,并没有在结束时调用notify,这是因为线程在die的时候会自动调用自身的notifyAll方法,来释放所有的资源和锁。

java基本数据类型有哪些

Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据类型。3、字符类型,字符类型的关键字是“char”。4、布尔类型,是表示逻辑值的基本数据类型。

看完了这篇文章,相信你对“JAVA多线程中join()方法怎么用”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: JAVA多线程中join()方法怎么用

本文链接: https://lsjlt.com/news/277201.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JAVA多线程中join()方法怎么用
    小编给大家分享一下JAVA多线程中join()方法怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正...
    99+
    2023-06-15
  • java多线程join方法怎么使用
    在Java中,join()方法是Thread类的一个方法,用于等待该线程完成执行。当在一个线程中调用另一个线程的join()方法时,当前线程会被阻塞,直到被调用的线程执行完毕。join()方法有两种使用方式:1. join():调用该方...
    99+
    2023-08-11
    java join
  • JAVA多线程中join()方法的使用方法
    虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客...
    99+
    2024-04-02
  • Python多线程以及多线程中join()的使用方法
    本篇内容主要讲解“Python多线程以及多线程中join()的使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python多线程以及多线程中join()的使用方法”吧!Python多线程与...
    99+
    2023-06-20
  • C#多线程的Join()方法
    一、简介 Join方法主要是用来阻塞调用线程,直到某个线程终止或经过了指定时间为止。官方的解释比较乏味,通俗的说就是创建一个子线程,给它加了这个方法,其它线程就会暂停执行,直到这个线...
    99+
    2024-04-02
  • join()方法如何在多线程中使用
    今天就跟大家聊聊有关join()方法如何在多线程中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Thread中,join()方法的作用是调用线程等待该线程完成后,才能继续用下运行...
    99+
    2023-05-31
    多线程 join
  • Python多线程以及多线程中join()的使用方法示例
    Python多线程与多进程中join()方法的效果是相同的。 下面仅以多线程为例: 首先需要明确几个概念: 知识点一: 当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流...
    99+
    2024-04-02
  • 怎么在python多线程中使用join
    怎么在python多线程中使用join?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、...
    99+
    2023-06-14
  • 怎么在java中利用join阻碍线程
    这篇文章给大家介绍怎么在java中利用join阻碍线程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员...
    99+
    2023-06-14
  • Java中 join线程的作用是什么
    Java中 join线程的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使调用join()的线程执行完毕后才能执行其它线程,在一定意义上,它可以实现同...
    99+
    2023-06-17
  • python的多线程中的join的作用
    1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样例子如下: import threading import time def say(name): print('...
    99+
    2023-01-31
    多线程 作用 python
  • Java中的线程如何使用使用join方法进行暂停
    Java中的线程如何使用使用join方法进行暂停?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下Java代码:package Threads;import java....
    99+
    2023-05-31
    java join 线程
  • python线程join方法与seDae
    基于上篇文章之后,我们了解了python程序执行流程,为什么要使用线程,以及什么情况下使用python线程,本文继此之后说说python多线程编程时,经常用到的join()和setDaemon()方法. join ()方法:主线程(主程...
    99+
    2023-01-31
    线程 方法 python
  • java多线程join()方法的作用和实现原理解析(应用场景)
    1、join() 方法的作用     这个方法的作用是先将当前线程挂起,待其他线程结束后在执行当前线程的代码; 2、应用场景 比如有三个人小红、小李、小王, 三...
    99+
    2024-04-02
  • java中多线程与线程池的基本使用方法
    目录前言继承Thread 实现Runnale接口Callable线程池常见的4种线程池。总结前言 在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,服务器...
    99+
    2024-04-02
  • Java中的线程中断方法怎么用
    本篇内容介绍了“Java中的线程中断方法怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java中的线程中断1 线程中断相关方法介绍Ja...
    99+
    2023-07-04
  • Java多线程怎么用
    这篇文章主要介绍了Java多线程怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、概念1.进程1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一...
    99+
    2023-06-17
  • python线程join怎么使用
    在Python中,线程的join()方法可以用来等待一个线程的结束。具体使用方法如下:1. 创建一个线程对象,并启动线程:```py...
    99+
    2023-09-25
    python
  • JavaScript中join()方法怎么用
    这篇文章将为大家详细讲解有关JavaScript中join()方法怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。join()将数组的所有元素连接成一个字符串。元素将...
    99+
    2024-04-02
  • Java 多线程中的Runnable怎么用
    Java 多线程中的Runnable怎么用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。package com.thread;public class&...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作