首先抛出对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. c# 对 struct为什么不能继承类和结构的思考

    1.类.结构在使用的时候可以不调用构造函数,如果能够继承类,这种情况下不能够初始化基类,因为不执行构造函数 2.结构.所有的结构类型都默认是 sealed,通过 反汇编可以看到  ,这就阻止了结构被继 ...

  2. 【mysql】关联查询_子查询_排序分组优化

    1. 关联查询优化 1.1 left join 结论: ①在优化关联查询时,只有在被驱动表上建立索引才有效! ②left join 时,左侧的为驱动表,右侧为被驱动表! 1.2 inner join ...

  3. Python - 面向对象编程 - 什么是 Python 类、类对象、实例对象

    什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html Python 类 类定义语法 最简单的类定义看起来像这样 class ClassName: ...

  4. redis rpoplpush列表转移元素

    文档出处:redisdoc.com/list/rpoplpush.html模式: 安全的队列 Redis的列表经常被用作队列(queue),用于在不同程序之间有序地交换消息(message).一个客户 ...

  5. 三.Go微服务--令牌桶实现原理

    1. 前言 在上一篇文章 Go微服务: 令牌桶 当中简单的介绍了令牌桶实现的原理,然后利用 /x/time/rate 这个库 10 行代码写了一个基于 ip 的 gin 限流中间件,那这个功能是怎么实 ...

  6. 过WAF的小思路

    过WAF的小思路 前言 最近在学习了一波CMS漏洞,尝试看了几个菠菜站,有宝塔WAF...向WHOAMI大佬取经回来后,绕过了一个WAF.觉得是时候要认真总结一下了:) 前期的过程 菠菜采用的是Thi ...

  7. 小程序 读取照片 EXIF 元信息

    安装 exif.js npm install exif-js --save UI <button type="primary" @click="onExif&quo ...

  8. JAVA 之 每日一记 之 算法 ( 长按键入 )

    题目详解: 你的朋友正在使用键盘输入他的名字 name.偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次. 你将会检查键盘输入的字符 typed.如果它对应的可能是你的朋友的 ...

  9. go语言调用everything的SDK接口

    介绍 官方SDK地址 本项目会将官方dll编译到可执行程序中,运行时无需考虑dll问题. 根据官方介绍,使用SDK前需要运行everything程序. 执行go build -tag ASCII时编译 ...

  10. scrapy抓取的页面中文会变成unicode字符串

    不了解编码的,需要先补下:http://www.cnblogs.com/jiangtu/p/6245264.html 在学习&使用scrapy抓取网上信息时,发现scrapy 会将含有中文的f ...