博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 多线程——join()方法
阅读量:5371 次
发布时间:2019-06-15

本文共 4092 字,大约阅读时间需要 13 分钟。

在java语言中,join()方法的作用是让调用该方法的线程在执行完run()方法后,再执行join 方法后面的代码。

简单点说就是,将两个线程合并,用于实现同步的功能。

具体而言:可以通过线程A的join() 方法来等待线程A的结束,或者使用线程A的join(1000)方法来等到线程A的结束,但是最多只等待1s.(时间数自己随便改。)

请看如下具体的例子,相信就会明白了

1.最原始的线程

1 public class TestJoin { 2  3     public static void main(String[] args) { 4         Thread t = new Thread(new ThreadImp()); 5         t.start(); 6         try { 7             //主线程的执行 8             for(int i=0;i<=5;i++){ 9                 System.out.println("当前为主线程,此时i为"+i);10                 Thread.sleep(1000);11             }12             13             System.out.println("join Finished");14         } catch (InterruptedException e) {15             // TODO Auto-generated catch block16             e.printStackTrace();17         }18 19     }20 21 }22 23 class ThreadImp implements Runnable{24 25     @Override26     public void run() {27         try{28             System.out.println("ThreadImp  is begining");29             Thread.sleep(5000);30             31             System.out.println("ThreadImp  End");32             33         }catch(InterruptedException e){34             e.printStackTrace();35         }36         37     }38     39 }

执行结果为:

当前为主线程,此时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()等待的时间后

1 public class TestJoin { 2  3     public static void main(String[] args) { 4         Thread t = new Thread(new ThreadImp()); 5         t.start(); 6         try { 7             t.join(2000);//主线程只等待t线程结束,只等待2秒 8             //判断t线程是否还在 9             if(t.isAlive()){10                 System.out.println("the t has not finished.");11             }else{12                 System.out.println("the t has finished.");13             }14             //主线程的执行15             for(int i=0;i<=5;i++){16                 System.out.println("当前为主线程,此时i为"+i);17                 Thread.sleep(1000);18             }19             20             System.out.println("join Finished");21         } catch (InterruptedException e) {22             // TODO Auto-generated catch block23             e.printStackTrace();24         }25 26     }27 28 }29 30 class ThreadImp implements Runnable{31 32     @Override33     public void run() {34         try{35             System.out.println("ThreadImp  is begining");36             Thread.sleep(5000);37             38             System.out.println("ThreadImp  End");39             40         }catch(InterruptedException e){41             e.printStackTrace();42         }43         44     }45     46 }

运行结果:

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线程和主线程交替执行。

转载于:https://www.cnblogs.com/yytlmm/p/4750552.html

你可能感兴趣的文章
策略模式 C#
查看>>
[模板]树状数组
查看>>
[HDU 6447][2018CCPC网络选拔赛 1010][YJJ's Salesman][离散化+线段树+DP]
查看>>
设计模式学习的好方法
查看>>
感谢Leslie Ma
查看>>
几种排序方法
查看>>
查看数据库各表的信息
查看>>
第一阶段测试题
查看>>
第二轮冲刺第五天
查看>>
图片压缩
查看>>
Hadoop-2.6.5安装
查看>>
ES6思维导图
查看>>
第四周作业
查看>>
20151121
查看>>
线段重叠 (思维好题)
查看>>
Codeforces Round #413 C. Fountains (线段树的创建、查询、更新)
查看>>
SBuild 0.1.5 发布,基于 Scala 的构建系统
查看>>
WordPress 3.5 RC3 发布
查看>>
DOM扩展札记
查看>>
primitive assembly
查看>>