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方法,它的作用是等待该线程死亡,在实际开发中偶尔也会用到它。
本文来自博客园,作者:小陈子博客,转载请注明原文链接:https://www.cnblogs.com/cj8357475/p/16086001.html