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 ...
随机推荐
- Chrom Firefox 非安全端口访问
使用Chrom Firefox 访问非安全端口 问题描述 Firefox 此网址已被限制 此网址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求. Chrome 无 ...
- kali linux 使用笔记本快捷键调节音量
环境:kali 2018.3a(xface桌面版),自带PulseAudio控制音量. 以前在windows时笔记本是Fn+F1这些来调节音量的,装了kali后原来调节亮度.触控板的键还能用,唯独音量 ...
- java网络编程小白教程
1 网络编程 1.1 网络 把多台终端(计算机)通过物理线路连接起来,形成网络.便于交换数据.共享信息.组成更强大的逻辑体. 1.1.1 网络通信三要素 [1]IP地址:唯一标识网络上的每一台计算机 ...
- storybook构建vue组件
最近在研究业务型组件的使用,因为在单独开发组件的时候需要调试,所以为每一个组件都编写一个webpack开发环境,然后上传上去为了其他人可以直接使用又把webpack上传上去,这样会有两个问题: 1:每 ...
- CNN 分割
测试的是Cifar10数据集,采用VGG模型的网络参数是[32, 'M', 64, 'M', 128, 128, 'M', 256, 256, 'M', 256, 256],准确度大概在90.6左右 ...
- 网页中嵌入google地图
一丶前言 大致需求:美国地图中标记分布的仓库图钉(鼠标经过显示地址详情),通过输入寄收件地邮编来在地图上定位位置添加图钉,将寄件地,选择的仓库,收件地图钉折线相连接,表示大致路线. 一丶google开 ...
- MTLAB: 稀疏矩阵的表示-sparse
我们在学习数值算法的过程中,发现像有限差分,谱方法和有限元方法的微分矩阵($\tt Differentiation~Matrices$)往往是稀疏的(即非零元素个数为$O(N)$,其中$N$为矩阵的维 ...
- rpm -ivh 安装与 rpm -U安装解决问题一例
[root@localhost server3.10.12]# rpm -ivh krb5-libs-1.15.1-18.el7.x86_64.rpm警告:krb5-libs-1.15.1-18.e ...
- php+redis 实现消息队列的推送【demo】。
用redis做队列,为了缓解瞬间请求服务器的压力.实际开发当中可通过定时任务去做.当然缺点是不够实时. 1.添加一个php文件,PushQueue.php <?php $redis=new re ...
- FileSystemObject对象及常用方法
FSO 对象模式包含在 Scripting 类型库中,该库位于 Scrrun.dll 文件中.因而,要使用 FSO 对象模式,必须把 Scrrun.dll 放在 Web 服务器的适当系统目录中. 要用 ...