• join() 方法详解及应用场景


    总结:join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。

    =============================

    在某些情况下,主线程创建并启动了子线程,如果子线程中需要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,如果主线程想等待子线程执行完毕后,获得子线程中的处理完的某个数据,就要用到join方法了,方法join()的作用是等待线程对象被销毁。

    public class Test {  
      
        public static class MyThread extends Thread {  
            @Override  
            public void run() {  
                  
                try {  
                    int m = (int) (Math.random() * 10000);  
                    System.out.println("我在子线程中会随机睡上0-9秒,时间为="+m);  
                    Thread.sleep(m);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
        public static void main(String[] args) throws InterruptedException {  
            MyThread myThread =new MyThread();  
            myThread.start();  
            myThread.join();  
            System.out.println("正常情况下肯定是我先执行完,但是加入join后,main主线程会等待子线程执行完毕后才执行");  
        }  
    }  
    

    结果为:

    我在子线程中会随机睡上0-9秒,时间为=9566
    正常情况下肯定是我先执行完,但是加入join后,main主线程会等待子线程执行完毕后才执行
    

    在主线程中,加入了myThread.join();  把谁加入了就要等谁。

    同时join还有join(millis)方法,可以加入等待时间,效果上类似sleep,但是还是有实际区别的。

    join底层是wait方法,所以它是会释放对象锁的,而sleep在同步的方法中是不释放对象锁的,只有同步方法执行完毕,其他线程才可以执行。

    使用场景

    曾经做过一个联通的增值业务项目,其中有一个业务需要给联通方暴漏接口,他们调用我们的接口,我们进行业务处理后,再返回结果,接口要求是同步的,实时返回。如果异步的就可以用消息队列解决了,吧整个业务逻辑中比较费时间的都放在了子线程中运行,子线程跑完后在交由主线程返回结果。当时用的是java中的栅栏 CyclicBarrier ,现在想想用join也是可以实现的。

  • 相关阅读:
    scanf的参数类型自动转换
    Gedit中文乱码
    在VirtualBox的Ubuntu虚拟机中与母体Windows共享文件夹
    Win7安vc2008编译报LINK : fatal error LNK1000: Internal error during IncrBuildImage
    贝叶斯后验概率小记
    美国计算机专业最好的前20名学校
    Linux磁盘空间不够怎么办?
    Debian6.0装机过程
    把用户加到sudoers组中的方法
    vi命令手册
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/7697780.html
Copyright © 2020-2023  润新知