首先抛出对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. ASP.NET Core教程:ASP.NET Core 程序部署到Windows系统

    一.创建项目 本篇文章介绍如何将一个ASP.NET Core Web程序部署到Windows系统上.这里以ASP.NET Core WebApi为例进行讲解.首先创建一个ASP.NET Core We ...

  2. wpf 中 theme 的使用 和 listview 模板的使用.

    theme 文件 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentatio ...

  3. springboot 2.0 整合 RestTemplate

    首先导入springboot 的 web 包 <dependency> <groupId>org.springframework.boot</groupId> &l ...

  4. 【java虚拟机】jvm内存模型

    作者:pengjunlee原文链接:https://blog.csdn.net/pengjunlee/article/details/71909239 目录 一.运行时数据区域 1.程序计数器 2.J ...

  5. 1TB是多大?

    TB是计算机的存储单位,用来描述计算机的存储容量.另外还有GB.MB.KB.B.就像长度单位米.分米.厘米.毫米一样,它们之间有换算关系: 1KB = 1024B 1M = 1024KB 1GB = ...

  6. nacos配置

    server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: #nacos 服务 ...

  7. ES6——类表达式

    //类表达式 const Person1 = class{ constructor(){ console.log('aa') } } //也可以跟上类名P,但是变量P在class外部是访问不到的,在c ...

  8. 微信公众号授权回调用户信息,获取openid

    1.--------------------用户授权登录并获取code 授权登录方式有两个,一种为静默授权登录(scope=snsapi_base),一种为非静默授权登录(scope=snsapi_u ...

  9. Appium自动化(8) - 可定位的控件属性

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 在前面几篇文章可以看到,一个 ...

  10. Linux常用命令 - more命令详解

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 每次显 ...