首先抛出对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. FastReport.net 绿色破解版winform中使用

    FastReport 是非常有名的报表库,曾经在delphi中经常看到 现在FastReport.net 是.net平台下的实现.它的价格对于个人开发者来说确实非常非常贵 出于学习的目的(0<& ...

  2. VS2017 提示找不到某个.dll库,或某个dll库丢失,原因

    可能因为那个dll的确不存在 可能因为需要在环境变量->系统环境变量->添加该dll所在目录

  3. 分享几个下载豆瓣资源的chrome插件

    最近chrome终于以4.69%的市场占有率击败firefox成为中国第二大浏览器.(第一当然是争霸宇宙的IE了) 虽然chrome官方应用程序商店有不少豆瓣的辅助插件,但大多没什么用.属于蛋疼插件. ...

  4. PXC 5.7.14 安装部署

    http://www.dbhelp.net/2017/01/06/pxc-5-7-14-%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2-pxc-install.html PX ...

  5. Powershell免杀从入门到实践

    转载https://www.jianshu.com/p/fb078a99e0d8 前言 文章首发于Freebuf 在之前发布的一篇 渗透技巧之Powershell实战思路 中,学习了powershel ...

  6. Tricks

    由于本人着实有些菜,因此在此积累一些巧妙的 \(Tricks\) ,以备不时之需... 与其说是 \(Tricks\) 不如说是学习笔记?? 数学 组合数 常见的数列 斐波那契数列 图论 树论 \(P ...

  7. 经典多级时间轮定时器(C语言版)

    经典多级时间轮定时器(C语言版) 文章目录 经典多级时间轮定时器(C语言版) 1. 序言 2. 多级时间轮实现框架 2.1 多级时间轮对象 2.2 时间轮对象 2.3 定时任务对象 2.4 双向链表 ...

  8. JS020. Array map()函数查到需要的元素时跳出遍历循环,不再执行到数组边界

    Array.prototype.map() map( )  方法创建一个 新数组 *,其结果是该数组中的每个元素是调用一次提供的 函数后的返回值 *.[ MDN / RUNOOB ] * map 添加 ...

  9. Element UI:级联选择器Cascader_动态加载_多级请求不同接口(已知第一级调取第二级)

    ELEMENT UI_CASCADER 使用过饿了么级联动态加载的小伙伴应该都知道,lazyLoad本身是一个无差别返回渲染结点的函数. 当我们存在一个需求:已知级联选择器的第一级结点,现在需要通过第 ...

  10. http接口实现附件对接

    1.推送附件 filebody /** * 推送附件方法 * @param args */ public static void main2(String[] args){ CloseableHttp ...