10.等待线程死亡join方法


 

 

等待线程死亡join方法

 导言

假设有三个线程,分别是线程a,线程b,和线程c他们各自的任务分别是打印数字一、数字2和数字三,

 

这三个线程同时启动,如何让这三个线程按顺序执行任务,也就是按顺序打印123

如果想让多个线程按顺序执行,可以使用thread类里面的join方法,它的作用是等待该线程死亡,死亡的意思是run方法执行结束,无论是顺利执行完毕,还是中途被中断,都算是死亡。如果被等待的线程被中断,将会引发线程中段异常。

演示 

下面来演示该方法,也是该方法需要用到三个任务,第一个任务是打印数字一,

package com.chenjie.executor.day10;

/**
 * packageName com.chenjie.executor.day10
 *
 * @author chenjie
 * @version JDK 8
 * @className OneTask (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class OneTask implements Runnable{
    @Override
    public void run() {
        System.out.println("1");
    }
}

第二个任务是打印数字二。不过我们需要在第二个任务里面执行第一个任务的线程的join方法,等待第一个任务的线程死亡,然后再执行打印数字二。所以我们需要在任务里面定一个thread属性。记录第一个任务的线程。接着我们定义设置线程的方法,再接着线程的join方法,等待该线程的死亡。

join方法有异常抛出,使用try---catch将其捕获。

package com.chenjie.executor.day10;

/**
 * packageName com.chenjie.executor.day10
 *
 * @author chenjie
 * @version JDK 8
 * @className OneTask (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class TwoTask implements Runnable{
    private Thread thread;

    public Thread getThread() {
        return thread;
    }

    public void setThread(Thread thread) {
        this.thread = thread;
    }

    @Override
    public void run() {

        try {
            thread.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("2");
    }
}

第三个任务和第二个任务,除了类名和输出的内容不一样以外,其余的都一样,至此三个任务都已全部编写完成。 

package com.chenjie.executor.day10;

/**
 * packageName com.chenjie.executor.day10
 *
 * @author chenjie
 * @version JDK 8
 * @className OneTask (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class ThreeTask implements Runnable{
    private Thread thread;

    public Thread getThread() {
        return thread;
    }

    public void setThread(Thread thread) {
        this.thread = thread;
    }

    @Override
    public void run() {

        try {
            thread.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("3");
    }
}

 

下面我们来创建这三个任务,然后创建三个线程,接着将三个任务分别传递给三个线程。在线程启动之前,我们需要将第二个任务等待的线程设置好,也就是将第一个任务的线程传递给第二个任务。同理将第二个任务的线程传递给第三个任务,最后我们来启动这三个线程。

 

package com.chenjie.executor.day10;

/**
 * packageName com.chenjie.executor.day10
 *
 * @author chenjie
 * @version JDK 8
 * @className Main (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class Main {
    public static void main(String[] args) {
        OneTask oneTask=new OneTask();
        Thread thread=new Thread(oneTask);
        thread.start();
        TwoTask twoTask=new TwoTask();
        twoTask.setThread(thread);
        Thread thread1=new Thread(twoTask);
        thread1.start();
        ThreeTask threeTask=new ThreeTask();
        Thread thread2=new Thread(threeTask);
        threeTask.setThread(thread1);
        thread2.start();
    }
}

 

 

 

从运行结果来看,数字123是按照顺序打印的。

1
2
3

进程已结束,退出代码为 0

总结

最后我们来总结一下本节的内容,本节介绍了线程thread类里面的join方法,它的作用是等待该线程死亡,在实际开发中偶尔也会用到它。 

 

posted @ 2022-04-26 22:10  小陈子博客  阅读(90)  评论(0编辑  收藏  举报