首先抛出对join的疑问

如果我有一个a线程,一个b线程

那此时

a.start();
b.start(); a.join();
b.join();

是否意思是a线程先执行完,然后再执行b线程;

如果是这样子那么就相当于一条单线程了,答案当然是否定的;

这个的实际意思是

a.start();//a线程先执行
b.start();//然后b线程在执行 a.join();//判断a线程是否执行完毕 //如果a线程执行完毕,才会向下执行
b.join();//判断b线程是否执行完毕

但实际上,在判断a.join()的过程中,a与b线程都在运行

此时假设a执行时间为10秒,b执行时间为20秒

在a.join()结束后,也就是a线程执行完毕后,再去b.join()判断b线程是否执行结束;

但此时b线程已经运行了10秒钟,则还需执行10秒钟;

假设a执行时间为20秒,b执行时间为10秒

那么a.join()结束后,b线程已经执行完毕,在调用b.join()时,就会直接结束;


为什么会想到这些?

在使用java遍历文件夹搜索某个文件时,按照文件夹的数量开辟线程引起

以下是模拟操作

首先有一个线程类

目的为10条线程分别打印0-10的数字,并且每次睡眠1秒钟

static class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName()+" "+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

之后

public static void main(String[] args) {

      long t1 = System.currentTimeMillis();

      for (int i = 0; i < 10; i++) {
MyThread t = new MyThread();
t.start();
try {
//注意这里
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
} } long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
}

此时在每个线程开始后就执行join方法,那么之后的所有得必须等t执行完才能继续往后执行,包括这个for循环

那么甚至线程的start()方法都受到了join()的影响,那么该多线程就退化成了一个单线程,执行时间为100054毫秒

修改后

public static void main(String[] args) {

        long t1 = System.currentTimeMillis();

        List<MyThread> threads = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
MyThread t = new MyThread();
t.start();
threads.add(t);
} for (MyThread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
} long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
}

此时通过一个List存储所有线程对象,先让他们统一都执行后,再去挨个join(),此时执行的总时间就相当于这10条线程中执行时间最长的时间,10008毫秒

join方法个人理解的更多相关文章

  1. Thread线程join方法自我理解

    Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...

  2. java基础知识回顾之java Thread类学习(十一)--join方法的理解

    以下面例子说明下面的源码:main 线程 和 A线程,A线程是main线程创建并且启动的,main线程优先级比较高,正在执行:这个时候main线程调用A.join()之后,main线程一直等待,直到A ...

  3. C#中Thread类中Join方法的理解(转载)

    指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行      比如 using System; namespace TestThreadJoin { class Pro ...

  4. 转载:Java多线程中join方法的理解

    转载自:http://uule.iteye.com/blog/1101994 thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A ...

  5. Java中join()方法的理解

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

  6. Java多线程中join方法的理解

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

  7. Java多线程-join方法

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

  8. 【多线程】java多线程 测试例子 详解wait() sleep() notify() start() join()方法 等

    java实现多线程,有两种方法: 1>实现多线程,继承Thread,资源不能共享 2>实现多线程  实现Runnable接口,可以实现资源共享 *wait()方法 在哪个线程中调用 则当前 ...

  9. JAVA join()方法

    转自:http://www.open-open.com/lib/view/open1371741636171.html 一.为什么要用join()方法 在很多情况下,主线程生成并起动了子线程,如果子线 ...

随机推荐

  1. Go并发控制--WaitGroup篇

    目录 1. 前言 2. 使用WaitGroup控制 2.1 使用场景 2.2 信号量 1.3 WaitGroup 数据结构 2.3.1 Add () 方法 2.3.2 Wait() 2.3.3 Don ...

  2. MySQL日志系统bin log、redo log和undo log

    MySQL日志系统bin log.redo log和undo log   今人不见古时月,今月曾经照古人. 简介:日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息,主要包括错误日 ...

  3. BUUCTF-[网鼎杯 2020 青龙组]AreUSerialz

    BUUCTF-[网鼎杯 2020 青龙组]AreUSerialz 看题 <?php include("flag.php"); highlight_file(__FILE__) ...

  4. GoLang设计模式3 - 抽象工厂模式

    之前我们介绍了工厂设计模式,现在我们再看一下抽象工厂设计模式.抽象工程模式顾名思义就是对工厂模式的一层抽象,也是创建型模式的一种,通常用来创建一组存在相关性的对象. UML类图大致如下: 类图比较复杂 ...

  5. mysqli的基本使用

    简单实例 面向过程方式 // 创建数据库连接 $connect = mysqli_connect('127.0.0.1', 'root', 'root', 'test', 8889); // 判读是否 ...

  6. linux7(centos7)新系统安装后要做的事!

    前言: 初学者在安装linux(centos)系统后,需要对服务器的环境做些简单配置! 怎么联网? 怎么对SSH优化设置? 怎么在众多服务器中识别谁是谁? 常用的小工具推荐等等... ###网络优化设 ...

  7. 性能测试工具JMeter 基础(五)—— 测试元件: 测试计划

    测试计划的定义: 测试计划是测试脚本的容器,定义了要执行什么.怎么执行对测试做总体的设置,且都是从线程组开始执行 在测试计划中可自定义用户变量(User Defined Variables),可通过A ...

  8. 关于electron-vue打包后静态视频文件无法正常加载的问题解决方法

    最近在使用electron-builder构建vue项目的时候发现在生产模式下视频可以正常加载并显示,但是一旦打包到开发环境下,视频就读取不出来了,控制台也并没有报错 一开始博主以为是路径问题,在将路 ...

  9. GO安装golang.org/x/net扩展库

    在学习golang过程中,有部分示例代码使用到了非标准库golang.org/x/net/html相关的库函数,但是标准代码库中没有该库,因此需要自己安装: 我这里使用git下载源码进行的安装. 为了 ...

  10. GridControl常用操作

    显示分组面板 gridView1.OptionsView.ShowGroupPanel = true; 是否开启多选 gridView1.OptionsSelection.MultiSelect = ...