Thread线程join方法自我理解
Thread线程join方法自我理解
thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.join();后面的代码
thread.join(long time):线程thread等待time时间之后,main-thread可以执行,注意time时间后,线程thread没有执行完,main-thread也可以运行
注意:上面2个方法必须在线程是alive的时候,才有这样的效果,否则不会有。
join()方法源码是有调用wait()方法的,wait方法是Object的方法,线程wait时,是释放对象锁的,所以调用join()方法是释放对象锁的线程阻塞同wait()方法。
class Runner1 implements Runnable{
    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + " begin...");
            Thread.sleep(2000);//①
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " finish...");
    }
}
class Runner2 implements Runnable{
    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + " begin...");
            Thread.sleep(1000);//②
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " finish...");
    }
}
public class Test_thread_join {
    /**
     * Thread.join()等待线程结束,再执行Thread.join后面的代码
     * Thread.join(n)等待线程结束或者n时间后,执行Thread.join后面的代码
     */
    public static void main(String[] args) {
        Runner1 r1 = new Runner1();
        Runner2 r2 = new Runner2();
        Thread t1 = new Thread(r1, "Thread-A");
        Thread t2 = new Thread(r2, "Thread-B");
        t1.start();//t1是alive的
        t2.start();
        try {
            t1.join();//当执行这个代码的时候,main线程阻塞,t2.这个线程可能运行着,也可能结束了
            t2.join();//如果在t1.join()执行的时候,t2线程已经运行结束,那这行代码是没有效果的③
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        run();
    }
    public static void run(){
        for(int i = 0; i < 5; i++){
            System.out.println("main i:" + i);
        }
    }
}
大意:①Thread-A睡眠2秒,②Thread-B睡眠1秒
执行结果:

结论:t1.join();执行时,main方法阻塞等待t1线程执行完;t1线程执行完之后,程序执行t2.join(),此时t2线程已经死亡了运行结束了,这行代码没有效果没有意义。如果t2没有死亡,那么main-thread,必须等待Thread-B死亡,才能执行后面的代码。如果③这行代码被注释了,并且t1.join()执行完之后t2线程仍然是alive的,那么main-thread和Thread-B线程将竞争CPU资源,他们的运行方式可能是交互式的。
Thread线程join方法自我理解的更多相关文章
- C#中Thread类中Join方法的理解(转载)
		
指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行 比如 using System; namespace TestThreadJoin { class Pro ...
 - java线程join方法使用方法简介
		
本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 public class ThreadTest { ...
 - Thread 的join方法
		
package com.cn.test.thread; public class TestJoin extends Thread{ private String name; public TestJo ...
 - 浅析Thread的join() 方法
		
Thread中的 join() 方法在实际开发过程中可能用的不是很多,但是在面试中作为考察基本功知识的扎实与否,经常会被用到.因此,对于 Thread 的 join() 方法进行了一定的研究. 常见的 ...
 - java基础知识回顾之java Thread类学习(十一)--join方法的理解
		
以下面例子说明下面的源码:main 线程 和 A线程,A线程是main线程创建并且启动的,main线程优先级比较高,正在执行:这个时候main线程调用A.join()之后,main线程一直等待,直到A ...
 - java线程基础巩固---分析Thread的join方法详细介绍,结合一个典型案例
		
关于Thread中的join方法貌似在实际多线程编程当中没怎么用过,在当初学j2se的时候倒时去学习过它的用法,不过现在早已经忘得差不多啦,所以对它再复习复习下. 首先先观察下JDK对它的介绍: 其实 ...
 - python thread的join方法解释
		
python的Thread类中提供了join()方法,使得一个线程可以等待另一个线程执行结束后再继续运行.这个方法还可以设定一个timeout参数,避免无休止的等待.因为两个线程顺序完成,看起来象一个 ...
 - 转载:Java多线程中join方法的理解
		
转载自:http://uule.iteye.com/blog/1101994 thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A ...
 - Java中join()方法的理解
		
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join ...
 
随机推荐
- 解决win10 蓝牙设备只能配对无法连接 ,并且删除设备无效的问题
			
系统环境: win10家庭版 dell本 问题描述:蓝牙设备(比如蓝牙键盘,蓝牙音箱)出现无法连接的情况,打算删除已配对的设备,再重新配对连接.但删除设备后重启蓝牙,那些原本被删除的设备又自动配对上, ...
 - H5外包团队 MUI文档技术资料大全
			
HTML5+ API缓存:http://www.dcloud.io/docs/api/zh_cn/cache.html h.js:http://www.hcoder.net/h vue.js:http ...
 - Ehcache计算Java对象内存大小
			
在EHCache中,可以设置maxBytesLocalHeap.maxBytesLocalOffHeap.maxBytesLocalDisk值,以控制Cache占用的内存.磁盘的大小(注:这里Off ...
 - tensorboard
			
在控制台输入: C:\Users\sunli\Documents\name\src>tensorboard --logdir=./w
 - CSS布局(圣杯、双飞翼、flex)
			
圣杯布局(float + 负margin + padding + position) <!DOCTYPE html> <html> <head> <meta ...
 - python常见报错类型
			
更新ing 报错类型 报错内容 错误判断 错误解决方式 IndentationError IndentationError:unexpected indent 格式错误:以外缩进 Indenta ...
 - python高阶函数(Map、Reduce、Filter、lamba)
			
Map函数 map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 代码如下: >>> def f(x): . ...
 - 关于index.html被缓存问题
			
关于web的缓存策略,推荐这篇文章:点击 在开发时候经常遇到一个问题,我们根据版本号去控制缓存问题,当我们发布新版本,使用心得版本号的时候,发现html里面引用的版本号却是旧的版本号 ,原来是该htm ...
 - go安装和开发工具安装
			
go适合做什么 l 服务端开发 l 分布式系统 l 网络编程 l 区块链开发 l 内存KV数据库,例如boltDB.levelDB l 云平台 一 go安装 官网:https://golang.goo ...
 - 2>&1 什么意思
			
1. 0 表示stdin标准输入 2. 1 表示stdout标准输出 3. 2表示stderr标准错误 意思是:把标准错误重定向到标准输出?