从头认识java-18.2 主要的线程机制(7)join
这一章节我们来讨论一下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的更多相关文章
- Java多线程(十)线程间通信 join
若果主线程想等待子线程执行完成之后再结束,可以用join方法 join 和sleep区别 join内部有wait实现,所以当执行join方法后,当前线程的锁被释放,那么其他线程就可以调用此线程的同步方 ...
- Java多线程学习(四)---控制线程
控制线程 摘要: Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程的执行 1. join线程控制,让一个线程等待另一个线程完成的方法 2. 后台线程,又称为守护线程 ...
- java多线程系列六、线程池
一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池. 2. 使用线程池的好处 a) 降低资源的消耗.使用线程池不用频繁的创建线程和销毁线程 b) 提高响应速度,任 ...
- java多线程面试题_线程并发面试题
1.什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个 ...
- Java(279-298)【异常、线程】
1.异常的概念&异常的体系 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将 受影响.在程序中的意思就是: 异常 :指的是程序在执行过 ...
- Java中的进程和线程
Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...
- Java中的进程与线程(总结篇)
详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- java查看当前项目所有线程列表界面
java查看当前项目所有线程列表界面 1.TestThread(测试类) package com.isoftstone.pcis.isc.job.king.panel; public class Te ...
随机推荐
- 群智能优化算法-测试函数matlab源码
群智能优化算法测试函数matlab源代码 global M; creatematrix(2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %画ackley图. %%%% ...
- mac下安装mysqlcient 报错
一.我在mac下pip3安装mysqlclient 报错: pip3 install mysqlclient Collecting mysqlclient Using cached mysqlclie ...
- 【OC语法快览】二、存取方法
Accessors 存取方法 All instance variables are private in Objective-C by default, so you should use acces ...
- 删除计算机里设备和驱动器中的爱奇艺、PPS、百度云、360云盘图标
转自:http://jingyan.baidu.com/article/86f4a73e59bb3037d6526936.html 点击"开始"找到"运行" 输 ...
- Golang学习途径总结
最近要进入一个新团队,新团队对异步开发好像很重视,我对异步开发技术再次做了一调研,其中Golang,之前看过一次The way to go,感觉就是简化C加协程和通道,这次又重新翻起,首先看了一下&l ...
- go--Ubuntu下安装GO LANG,测试输入hello world
1.下载go语言源码,https://storage.googleapis.com/golang/go1.6.1.linux-amd64.tar.gz 2.解压缩源码包tar zxvf go1.6.1 ...
- Django 自带密码加密,自定密码加密方式 及自定义验证方式
在django1.6中,默认的加密方式是pbkdf_sha256,具体算法不表,一直以来用django的自带用户验证都十分顺手,今天有需求,需要修改默认加密方式为md5,具体方法为: 在setting ...
- 【Codewars】7×7 摩天大楼
介绍 链接:7×7 Skyscrapers C#答案(原因:懒,但是完全可以转成C++):bajdcc/learnstl 题目(机翻): 在7乘7格的网格中,你只想在每个广场上放置一个摩天大楼,只有一 ...
- 阅读ANSI C,寻找乐趣和裨益——const char **与char **为何不兼容
#include<stdio.h> void foo1(const char**p) { } void foo2(const char*p) { } int main(int argc,c ...
- c++之——派生类的同名成员和函数调用方式及构造析构顺序
#include<iostream> using namespace std; class Object { public: Object(), b(), c() { cout <& ...