在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()方法的更多相关文章

  1. java多线程 join方法以及优先级方法

    /*join:当A线程执行到了B线程的.join()方法时,A就会等待.等B线程都执行完,A才会执行. join可以用来临时加入线程执行. 1.线程使用join方法,主线程就停下,等它执行完,那么如果 ...

  2. Java多线程-join方法

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

  3. 我也学习JAVA多线程-join

    在工作中,挺少遇到join关键字,但很多多线程资料和面试过程中,初中级开发工程师总会遇到join. 今天一起学习下join. join的作用:等待指定的时间(当为0时,一直等待),直到这个线程执行结束 ...

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

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

  5. 简谈Java的join()方法

    join()是Thread类的一个方法.根据jdk文档的定义: public final void join()throws InterruptedException: Waits for this ...

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

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

  7. Java通过join方法来暂停当前线程

    目标线程的join方法暂停当前线程,直到目前线程完成(从run()方法返回). Java代码: package Threads; import java.io.IOException; /** * C ...

  8. C#多线程JOIN方法初探

    [说明:刚接触多线程时,弄不明白Join()的作用,查阅了三本书,都不明不白.后来经过自己的一番试验,终于弄清了Join()的本质.大家看看我这种写法是否易懂,是否真的写出了Join()的本质,多提宝 ...

  9. [java] java 线程join方法详解

    join方法的作用是使所属线程对象正常执行run方法,而对当前线程无限期阻塞,直到所属线程销毁后再执行当前线程的逻辑. 一.先看普通的无join方法NoJoin.java public class N ...

随机推荐

  1. GitBlit中出现 error: remote unpack failed: error Missing tree

    clu@WASYGSHA01-1020 MINGW64 /d/ChuckLu/Git/Edenred/LISA_5.0.0.0 (local)$ git push origin preaction:p ...

  2. CoreData 从入门到精通 (一) 数据模型 + CoreData 栈的创建

    CoreData 是 Cocoa 平台上用来管理模型层数据和数据持久化的一个框架,说简单点,就是一个数据库存储框架.CoreData 里相关的概念比较多,而且初始化也非常繁琐,所以对初学者的学习还是有 ...

  3. [jzoj NOIP2018模拟11.02]

    嗯T1忘记取模了,100到20 嗯T2忘记了那啥定理,暴力也写炸了,这题我认 嗯T3线段树合并分裂没有写炸,考场上就知道妥妥的70分.但是,分数出的时候听到有人说暴力也是70分,我???脸黑,枉我敲了 ...

  4. Appserv 2.5.10 升级PHP from version 5.2 to 5.3

    解决方案查看 该文章:http://blog.csdn.net/dull_boy2/article/details/43927363

  5. Windows 安装PostgreSQL

    下载二进制包:https://www.enterprisedb.com/download-postgresql-binaries 直接解压到C盘 Microsoft Windows [版本 6.3.9 ...

  6. HDU 1338 Game Prediction【贪心】

    解题思路: 给出 n  m 牌的号码是从1到n*m 你手里的牌的号码是1到n*m之间的任意n个数,每张牌都只有一张,问你至少赢多少次 可以转化为你最多输max次,那么至少赢n-max次 而最多输max ...

  7. frameset宽屏居中写法

    在写frameset的时候发现页面较小的时候不能在屏幕上居中,记录一下frameset页面居中的写法 <frameset cols="*,1280,*" frameborde ...

  8. 3ds Max灯光教程之卧室灯光布局实例

    对于设计师来说要做好一张好的作品效果图包括很多比如:“造型.色彩搭配.灯光气氛.构图角度等等,上次给大家详细的分析了下产品渲染中摄像机的构图及原理.本期教程来跟大家讨论一下max场景灯光布局问题.以卧 ...

  9. html转word文档

    html转word文档 package cn.com.szhtkj.util; import java.io.ByteArrayInputStream; import java.io.File; im ...

  10. 【模板】扩展中国剩余定理(EXCRT)

    扩展中国剩余定理,是求解形如:$x\equiv a_{1}($ mod $b_{1})$$x\equiv a_{2}($ mod $b_{2})$$x\equiv a_{3}($ mod $b_{3} ...