java 多线程——join()方法
在java语言中,join()方法的作用是让调用该方法的线程在执行完run()方法后,再执行join 方法后面的代码。
简单点说就是,将两个线程合并,用于实现同步的功能。
具体而言:可以通过线程A的join() 方法来等待线程A的结束,或者使用线程A的join(1000)方法来等到线程A的结束,但是最多只等待1s.(时间数自己随便改。)
请看如下具体的例子,相信就会明白了
1.最原始的线程
public class TestJoin {
public static void main(String[] args) {
Thread t = new Thread(new ThreadImp());
t.start();
try {
//主线程的执行
for(int i=0;i<=5;i++){
System.out.println("当前为主线程,此时i为"+i);
Thread.sleep(1000);
}
System.out.println("join Finished");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ThreadImp implements Runnable{
@Override
public void run() {
try{
System.out.println("ThreadImp is begining");
Thread.sleep(5000);
System.out.println("ThreadImp End");
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
执行结果为:
当前为主线程,此时i为0
ThreadImp is begining
当前为主线程,此时i为1
当前为主线程,此时i为2
当前为主线程,此时i为3
当前为主线程,此时i为4
ThreadImp End
当前为主线程,此时i为5
join Finished
看以看到,最基本的线程之间来回切换执行。
2.当在主线程中代用 t线程的join方法后(不设置等待时间)
public class TestJoin {
public static void main(String[] args) {
Thread t = new Thread(new ThreadImp());
t.start();
try {
t.join();//判断t线程是否还在
if(t.isAlive()){
System.out.println("the t has not finished.");
}else{
System.out.println("the t has finished.");
}
//主线程的执行
for(int i=0;i<=5;i++){
System.out.println("当前为主线程,此时i为"+i);
Thread.sleep(1000);
}
System.out.println("join Finished");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ThreadImp implements Runnable{
@Override
public void run() {
try{
System.out.println("ThreadImp is begining");
Thread.sleep(5000);
System.out.println("ThreadImp End");
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
运行结果为:
ThreadImp is begining
ThreadImp End
the t has finished.
当前为主线程,此时i为0
当前为主线程,此时i为1
当前为主线程,此时i为2
当前为主线程,此时i为3
当前为主线程,此时i为4
当前为主线程,此时i为5
join Finished
可以看出 ,在主线程中调用t.join()方法, 导致t线程结束后再执行后面的主线程。
3. 设置join()等待的时间后
public class TestJoin {
public static void main(String[] args) {
Thread t = new Thread(new ThreadImp());
t.start();
try {
t.join(2000);//主线程只等待t线程结束,只等待2秒
//判断t线程是否还在
if(t.isAlive()){
System.out.println("the t has not finished.");
}else{
System.out.println("the t has finished.");
}
//主线程的执行
for(int i=0;i<=5;i++){
System.out.println("当前为主线程,此时i为"+i);
Thread.sleep(1000);
}
System.out.println("join Finished");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ThreadImp implements Runnable{
@Override
public void run() {
try{
System.out.println("ThreadImp is begining");
Thread.sleep(5000);
System.out.println("ThreadImp End");
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
运行结果:
ThreadImp is begining
the t has not finished.
当前为主线程,此时i为0
当前为主线程,此时i为1
当前为主线程,此时i为2
当前为主线程,此时i为3
ThreadImp End
当前为主线程,此时i为4
当前为主线程,此时i为5
join Finished
可以得到,t线程运行,等待t线程2s时间后,主线程便迫不及待的执行,此时t线程还没结束,然后t线程和主线程交替执行。
java 多线程——join()方法的更多相关文章
- java多线程 join方法以及优先级方法
/*join:当A线程执行到了B线程的.join()方法时,A就会等待.等B线程都执行完,A才会执行. join可以用来临时加入线程执行. 1.线程使用join方法,主线程就停下,等它执行完,那么如果 ...
- Java多线程-join方法
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. 具体例子看链接 ...
- 我也学习JAVA多线程-join
在工作中,挺少遇到join关键字,但很多多线程资料和面试过程中,初中级开发工程师总会遇到join. 今天一起学习下join. join的作用:等待指定的时间(当为0时,一直等待),直到这个线程执行结束 ...
- java线程join方法使用方法简介
本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 public class ThreadTest { ...
- 简谈Java的join()方法
join()是Thread类的一个方法.根据jdk文档的定义: public final void join()throws InterruptedException: Waits for this ...
- Java中join()方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join ...
- Java通过join方法来暂停当前线程
目标线程的join方法暂停当前线程,直到目前线程完成(从run()方法返回). Java代码: package Threads; import java.io.IOException; /** * C ...
- C#多线程JOIN方法初探
[说明:刚接触多线程时,弄不明白Join()的作用,查阅了三本书,都不明不白.后来经过自己的一番试验,终于弄清了Join()的本质.大家看看我这种写法是否易懂,是否真的写出了Join()的本质,多提宝 ...
- [java] java 线程join方法详解
join方法的作用是使所属线程对象正常执行run方法,而对当前线程无限期阻塞,直到所属线程销毁后再执行当前线程的逻辑. 一.先看普通的无join方法NoJoin.java public class N ...
随机推荐
- JAVA设计模式之【组合模式】
组合模式 用面向对象的方式来处理树形结构 组合多个对象形成树形结构以表示具有"整体-部分"关系的层次结构. 在组合模式中引入了抽象构件类Component,它是所有容器类和叶子类的 ...
- ThinkPHP5.0框架开发--第7章 TP5.0数据库操作
ThinkPHP5.0框架开发--第7章 TP5.0数据库操作 第7章 TP5.0数据库操作 ===================================================== ...
- Java TreeMap 介绍和使用
转自:https://www.cnblogs.com/skywang12345/p/3310928.html 概要 这一章,我们对TreeMap进行学习. 我们先对TreeMap有个整体认识,然后再学 ...
- iframe 高度宽度自适应
<iframe id="iframeHome" name="iframeHome" src="/Page/NewHome/GongZuoTai. ...
- java中对象和对象引用的区别
1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一 ...
- eclipse用tomcat发布网站的目录
用eclipse添加的tomcat发布网站时,在tomcat安装目录中的webapps时找不到发布的网站.这是由于eclipse的默认配置,把项目发布到别的文件夹中了.如果想发布到webapps里面, ...
- c语言中,常见数据类型的字节数
一直记不住这个,特意mark下来 和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异.但有几条铁定的原则(ANSI/ISO制订的): 1 size ...
- javascript 异或运算符实现简单的密码加密功能
写在前面的 当我们需要在数据库中存储用户的密码时,当然是不能明文存储的. 我们就是介绍一下用^运算符来实现简单的密码加密以及解密功能 上代码 首先,回顾一下基础知识. String.fromCharc ...
- eclipse的springMVC环境搭建并输出HelloWorld
spring简单介绍:https://www.cnblogs.com/package-java/p/10368672.html 1.创建一个Maven Project项目 点击下一步 点击下一步 2. ...
- hook中ref使用
hook使用ref 父组件: 引入 useRef 声明ref的名字 const dateRef = useRef() 复值给组件 ref={d ...