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方法自我理解的更多相关文章

  1. C#中Thread类中Join方法的理解(转载)

    指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行      比如 using System; namespace TestThreadJoin { class Pro ...

  2. java线程join方法使用方法简介

    本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 public class ThreadTest { ...

  3. Thread 的join方法

    package com.cn.test.thread; public class TestJoin extends Thread{ private String name; public TestJo ...

  4. 浅析Thread的join() 方法

    Thread中的 join() 方法在实际开发过程中可能用的不是很多,但是在面试中作为考察基本功知识的扎实与否,经常会被用到.因此,对于 Thread 的 join() 方法进行了一定的研究. 常见的 ...

  5. java基础知识回顾之java Thread类学习(十一)--join方法的理解

    以下面例子说明下面的源码:main 线程 和 A线程,A线程是main线程创建并且启动的,main线程优先级比较高,正在执行:这个时候main线程调用A.join()之后,main线程一直等待,直到A ...

  6. java线程基础巩固---分析Thread的join方法详细介绍,结合一个典型案例

    关于Thread中的join方法貌似在实际多线程编程当中没怎么用过,在当初学j2se的时候倒时去学习过它的用法,不过现在早已经忘得差不多啦,所以对它再复习复习下. 首先先观察下JDK对它的介绍: 其实 ...

  7. python thread的join方法解释

    python的Thread类中提供了join()方法,使得一个线程可以等待另一个线程执行结束后再继续运行.这个方法还可以设定一个timeout参数,避免无休止的等待.因为两个线程顺序完成,看起来象一个 ...

  8. 转载:Java多线程中join方法的理解

    转载自:http://uule.iteye.com/blog/1101994 thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A ...

  9. Java中join()方法的理解

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join ...

随机推荐

  1. 用《捕鱼达人》去理解C#中的多线程

    线程是进程中某个单一顺序的控制流,是程序运行中的调度单位,是程序执行流的最小单位,一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成. 线程自己不拥有系统资源,只拥有一点儿在运行中必 ...

  2. 四、Python数据类型(二)

    一.布尔(Boolean) 布尔类型的数据只有两个:(真)True和(假)False.多用于条件语句或者是作为函数返回值. 二.字典(dictionary) 1.认识字典 将数据组织成键值对(key- ...

  3. Codeforces 396 E. Valera and Queries

    题目链接:http://codeforces.com/problemset/problem/369/E 考虑将问题转化为有多少条线段没有覆盖这些点,如果一个询问的点集是${[x1,x2,...,xn] ...

  4. 关于在html中直接引入less文件遇到的小问题

    由于想直接在html页面上调用less文件,所以直接在代码上直接引入 <script src="bower_components/less/dist/less.js"> ...

  5. 腾讯云centos7.2安装宝塔面板和LAMP

    1.安装好centos7.2系统后,登录centos系统输入如下命令: yum install -y wget && wget -O install.sh http://downloa ...

  6. js 获取昨天,今天,本周,上周,季度等时间范围(封装的js)

    (function ($, ht) { "use strict"; $.extend(ht, { clickTimeRange:function(){ //点击重置按钮,时间文本框 ...

  7. ASP.NET MVC 目录介绍

  8. leetcode 703数据流中的第K大元素

    这里思路是堆排序,而且是小根堆.C++中包含在头文件<queue>的priority_queue本质就是堆排序实现的.其中priority_queue函数原型是 priority_queu ...

  9. 简单的压力测试工具 siege

    $ siege -c 1000 -r 100 -b http://127.0.0.1:13579/3344 HTTP/1.0 200 0.02 secs: 49 bytes ==> GET /3 ...

  10. Introduction and use of Cookie and Session(Cookie&Session的介绍和使用)

    一.Cookie 1.什么是Cookie? Cookie是HTTP协议的规范之一,它是服务器和客户端之间传输的小数据. 首先由服务器通过响应头把Cookie传输给客户端,客户端会将Cookie保存起来 ...