这一章节我们来讨论一下join。

1.什么是join?

阻塞当前线程,让.join的线程先做完。然后再继续当前线程

以下是api的解释:

A.join,在API中的解释是,阻塞当前线程B,直到A运行完毕并死掉,再运行B。

2.样例:

package com.ray.ch17;

public class Test {

	public static void main(String[] args) throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " start");
SleepThread sleepThread = new SleepThread("sleep");
Thread.sleep(2000);
JoinThread joinThread = new JoinThread(sleepThread, "join");
// joinThread.join();
System.out.println(Thread.currentThread().getName() + " end");
}
} class SleepThread extends Thread { public SleepThread(String name) {
super(name);
start();
} @Override
public void run() {
try {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + " SleepThread");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} class JoinThread extends Thread { private SleepThread sleepThread; public JoinThread(SleepThread sleepThread, String name) {
super(name);
this.sleepThread = sleepThread;
start();
} @Override
public void run() {
try {
System.out.println(getName() + " join start");
sleepThread.join();
System.out.println(getName() + " join end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

输出:

main start
sleep SleepThread
sleep SleepThread
sleep SleepThread
main end
join join start
sleep SleepThread
sleep SleepThread
join join end

package com.ray.ch17;

public class Test {

	public static void main(String[] args) throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " start");
SleepThread sleepThread = new SleepThread("sleep");
Thread.sleep(2000);
JoinThread joinThread = new JoinThread(sleepThread, "join");
joinThread.join();
System.out.println(Thread.currentThread().getName() + " end");
}
} class SleepThread extends Thread { public SleepThread(String name) {
super(name);
start();
} @Override
public void run() {
try {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + " SleepThread");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} class JoinThread extends Thread { private SleepThread sleepThread; public JoinThread(SleepThread sleepThread, String name) {
super(name);
this.sleepThread = sleepThread;
start();
} @Override
public void run() {
try {
System.out.println(getName() + " join start");
sleepThread.join();
System.out.println(getName() + " join end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

输出:

main start
sleep SleepThread
sleep SleepThread
sleep SleepThread
join join start
sleep SleepThread
sleep SleepThread
join join end
main end

上面两个代码的不同主要是体如今joinThread.join();是否被凝视。

对照上面的两个代码的输出,主要不同在于main end 的位置。当joinThread.join();的时候,因为须要先阻塞main方法的线程,先完毕joinThread所在线程,因此main end的位置会出现上面的变化。

还有一方面。我们从sleep和join两个线程输出的文字的位置也能够推导出上面的结论。

总结:这一章节我们简介了一下join。

这一章节就到这里,谢谢。

-----------------------------------

文件夹

从头认识java-18.2 主要的线程机制(7)join的更多相关文章

  1. Java多线程(十)线程间通信 join

    若果主线程想等待子线程执行完成之后再结束,可以用join方法 join 和sleep区别 join内部有wait实现,所以当执行join方法后,当前线程的锁被释放,那么其他线程就可以调用此线程的同步方 ...

  2. Java多线程学习(四)---控制线程

    控制线程 摘要: Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程的执行 1. join线程控制,让一个线程等待另一个线程完成的方法 2. 后台线程,又称为守护线程 ...

  3. java多线程系列六、线程池

    一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池. 2. 使用线程池的好处 a) 降低资源的消耗.使用线程池不用频繁的创建线程和销毁线程 b) 提高响应速度,任 ...

  4. java多线程面试题_线程并发面试题

    1.什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个 ...

  5. Java(279-298)【异常、线程】

    1.异常的概念&异常的体系 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将 受影响.在程序中的意思就是: 异常 :指的是程序在执行过 ...

  6. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  7. Java中的进程与线程(总结篇)

    详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...

  8. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  9. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  10. java查看当前项目所有线程列表界面

    java查看当前项目所有线程列表界面 1.TestThread(测试类) package com.isoftstone.pcis.isc.job.king.panel; public class Te ...

随机推荐

  1. mysql 更新数据表的记录

    对于表里的记录值,可以通过update 命令进行更改,语法如下: UPDATE tablename SET field1=value1,field2.=value2,……fieldn=valuen [ ...

  2. Spring Cloud构建微服务架构(三)断路器

    在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待.这样就不会使得线程因 ...

  3. 微信H5支付.NET版本备忘

    微信H5支付.NET版本备忘

  4. 基于FPGA的异步FIFO设计

    今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...

  5. 使用VMware安装CentOS7步骤详情

    准备资料: CentOS-7-x86_64-Everything-1611 点击下载CentOS 对,资料就这些 第一步.  点击文件  再点击新建虚拟机 第二步 .点击完新建虚拟机之后会跳出一个窗口 ...

  6. angular学习笔记(十三)

    本篇主要介绍控制器的$scope中的数据是如何被改变的: 以下三种方法,都可以改变$scope中的number值: 1. 表达式: <span ng-click="number=num ...

  7. CSocket类网络编程 MFC

    Visual C++的MFC提供了CSocket类用来实现网络通信. 下面介绍VC++在Windows 95中实现Socket的 CSocket 类相关成员函数(这些成员函数实际上是从CAsyncSo ...

  8. 如何读取jar包外的properties文件和log4j.properties

    http://jrails.iteye.com/blog/1705464 ***************************************' 一般在项目中使用properties配置文件 ...

  9. spring boot设定mysql

    mysql创建表,制定自增,utf-8编码 create table person(id int auto_increment primary key,  name varchar(100), age ...

  10. LeetCode: Combinations 解题报告

    Combinations Given two integers n and k, return all possible combinations of k numbers out of 1 ... ...