Java Thread.join(),结合例子只学一次

简介: Java Thread.join(),结合例子只学一次

我们直接结合代码来讲解,


创建一个SimpleTestDemo.java,在里面分别调用三个子线程(三种编写方式,其实都一样):

 

public class SimpleTestDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t1= new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("1111111111111  Thread");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        //运行子线程 1
        t1.start();
        Thread t2=new Thread(() -> {
            try {
                System.out.println("2222222222222  Thread");
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        //运行子线程 2
        t2.start();
        Thread t3= new Thread(() -> System.out.println("3333333333333  Thread"));
        //运行子线程 3
        t3.start();
        //主线程的输出
        System.out.println("  The End  !");
    }
}

运行结果:

image.png


从运行结果,可以看到,三个子线程异步执行,所以导致每次运行的输出结果不一定是一样的,因为都在抢资源。


为了让这种异步执行的场景模拟更加真实,我们在子线程1上加上sleep(2000):


image.png


再看看运行结果,因为子线程1执行时间久,所以最后才执行完毕:


image.png


OK,接下来就是Thread.join()的运用了。  


虽然子线程1执行得久,但是我们依然想先确保子线程1被执行完毕后才执行后面的代码,那么我们就需要调用子线程1的join()方法:


image.png


这样我们再看看运行结果,尽管子线程1执行了很久,但是其他的代码依然等待子线程1执行完毕再进行执行:


image.png


到这里,很明显已经看到了join的作用了,简单来说,就是主线程跟各子线程之间其实都是异步的执行的;


但是如果使用了某个子线程的join()方法,那么就是 强行在此刻转变成了同步执行,也就是后面还未执行的代码(子线程调用等),都必须等,等到使用join()方法的线程执行完毕才能继续放飞自我。


那么join方法还有其他作用么, 有的,在调用的时候发现是可以填入参数的:


image.png


这个参数,毫秒,作用是什么呢?


作用是最大等待时间,也就是说虽然使用了join(),后面的代码需要等待这个子线程执行完毕后才能开始运行,但是我们如果想实现,如果这子线程执行时间超过某个限制,我们就不等了,直接执行后面的代码,这么我们只需要把限制时间毫秒级别作为参数填入join()即可。


之前我们子线程1 sleep(2000),那么我们就尝试下join(1000),也就是说,超过1000毫秒,就不等了:


image.png


看看运行结果,虽然子线程1使用了join,但是我们加上了最大等待时间1000毫秒,所以等了1000毫秒后,后面的代码直接运行了,最后最后子线程1才执行完毕输出了内容:


image.png


OK,到此

相关文章
|
Java
java中的方法、类、对象详解区别(含有例子)
一个类中只能有一个public class 类名
150 0
java中的方法、类、对象详解区别(含有例子)
|
Java
Java常用API---Runtime(消息机制)含代码例子
私有化构造方法,不能被实例化
182 0
Java常用API---Runtime(消息机制)含代码例子
|
Java
Java运算符讲解附例子说明(大全)
Java运算符分为六大:算术运算符、赋值运算符、比较运算符、逻辑运算符、条件(三目)运算符、位运算符
98 0
Java运算符讲解附例子说明(大全)
|
Java
Java类与对象(例子讲解)
Java类与对象(例子讲解)
123 0
Java类与对象(例子讲解)
|
Java 程序员 调度
生活中例子告诉你:Java NIO复用器Selectors
生活中例子告诉你:Java NIO复用器Selectors
182 0
生活中例子告诉你:Java NIO复用器Selectors
|
Java
【Java多线程】写一个死锁的例子
【Java多线程】写一个死锁的例子
114 0
|
Java
一个小例子体会Java反射的动态性
一个小例子体会Java反射的动态性
112 0
|
安全 Java API
Java日期与时间API(详解全部新与旧API,含代码例子)
在时间工具类里面重点学习这两个就差不多了LocalDateTime(全部)和DateTimeFormatter(转化格式)
173 0
|
Java
Java接口概念和语法例子(功能性方法)
比如有三个类。兔子、狗、青蛙这三个类。要定义一个公共游泳方法出来。但是兔子不会这个游泳,那么就不使用这个接口,另外的狗和青蛙会游泳,就会使用这个游泳接口。简单来说,就是谁需要功能接口谁就使用这个功能接口就好了
124 0
|
Java
Java内部类大全(含代码例子)
写在一个类里面的类就叫内部类
101 0