• java 多线程 Thread.join子线程结束父线程再运行;join(long):等待超时毫秒数


    Join的使用

    目的:当子线程运行结束后,父线程才能再继续运行

    /**
     * @ClassName ThreadJoinExample
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/4/24.
     */
    public class ThreadJoinExample {
        public static void main(String[] args) throws InterruptedException {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    String tName = Thread.currentThread().getName();
                    try {
                        System.out.println(tName + "开始运行");
                        Thread.sleep(4000);
                        System.out.println(tName +"运行结束!");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            Thread thread = new Thread(r,"子任务1");
            Thread thread2 = new Thread(r,"子任务2");
            thread.start();
            thread2.start();
            thread.join(); //子线程阻塞主线程,待子线程运行结束
            thread2.join(); //子线程阻塞主线程,待子线程运行结束
            Thread.sleep(1000);
            System.out.println("主线程运行结束!");
        }
    }

     不能interrupt中断一个有join()子线程的父线程

    /**
     * @ClassName ThreadInterruptJoinThread
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/4/24.
     */
    public class ThreadInterruptJoinThread {
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread("parent"){
                @Override
                public void run() {
                    System.out.println(getName() + "开始运行");
                    Thread thread1 = new Thread("child"){
                        @Override
                        public void run() {
                            System.out.println(getName() + "开始运行");
                            try {
                                Thread.sleep(3000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            System.out.println(getName() + "运行结束");
                        }
                    };
                    thread1.start();
                    //thread1.join();
                    try {
                        thread1.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(getName() + "运行结束");
                }
            };
            thread.start();
            Thread.sleep(1000);
            thread.interrupt();
            thread.join();
            System.out.println("主线程运行结束");
        }
    }

    如上代码执行结果:join的child子线程还没结束,父线程就被interrupt中断,会导致父线程异常,且不再等待子线程child运行结束。

    join(long):等待指定时间不结束就不等待了

    /**
     * @ClassName ThreadJoinTime
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/4/24.
     */
    public class ThreadJoinTime {
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread("child"){
                @Override
                public void run() {
                    System.out.println("子线程开始运行");
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("子线程运行结束");
                }
            };
            thread.start();
            thread.join(1000);
            System.out.println("主线程代码运行结束");
        }
    }
  • 相关阅读:
    [BZOJ1584][Usaco2009 Mar]Cleaning Up 打扫卫生
    CSS浮动
    Django by example -----1总结
    C#函数重载
    linux目录的特点
    Linux调优
    linux
    对齐方式
    19-10-25-G-悲伤
    19-10-24-H
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/14698282.html
Copyright © 2020-2023  润新知