Java多线程:保证线程按照一定顺序运行

Java多线程:保证线程按照一定顺序运行


前言

Java的多线程经常被使用,然而多线程在运行的时候往往需要保证一定的运行顺序,否则可能出错或者意想不到的结果。

本文介绍了一种保证多个线程按照顺序依次执行的方法,需要用到 Thread.join() 。


一、Thread.join() 介绍

join 方法的本质调用的是 Object 中的 wait() 方法实现线程的阻塞。

主要作用:主线程等待子线程的终止。也就是说主线程的代码块中,如果碰到了t.join()方法,此时主线程需要等待(阻塞),等待子线程结束了(Waits for this thread to die.),才能继续执行t.join()之后的代码块。

调用wait方法必须要获取锁,所以 join 方法是被 synchronized 修饰的,synchronized 修饰在方法层面相当于synchronized(this),this 就是当前线程的实例

Thread.join() 源码:

public final synchronized void join(long millis) throws InterruptedException {
    
    
    long base = System.currentTimeMillis();
    long now = 0;

    if (millis < 0) {
    
    
        throw new IllegalArgumentException("timeout value is negative");
    }

	//判断是否携带阻塞的超时时间,等于0表示没有设置超时时间
    if (millis == 0) {
    
    
        //isAlive获取线程状态,无线程等待直到 join 的线程结束
        while (isAlive()) {
    
    
            //调用Object中的wait方法实现线程的阻塞
            wait(0);
        }
    } else {
    
    
        while (isAlive()) {
    
    
            long delay = millis - now;
            if (delay <= 0) {
    
    
                break;
            }
            wait(delay);
            now = System.currentTimeMillis() - base;
        }
    }
}

详细内容可以参考以下链接:
Thread.join()详解
Thread之三:Thread Join()的用法

二、解决方案

具体解决方案看代码示例:

public class JoinTest {
    
    
	 // 1.现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行
	 public static void main(String[] args) {
    
    
		 final Thread t1 = new Thread(new Runnable() {
    
    
			 @Override
			 public void run() {
    
    
			 	System.out.println("t1");
			 }
		 });
		 final Thread t2 = new Thread(new Runnable() {
    
    
			 @Override
			 public void run() {
    
    
			 try {
    
    
			 	// 引用t1线程,等待t1线程执行完
			 	t1.join();
			 } catch (InterruptedException e) {
    
    
			 	e.printStackTrace();
			 }
			 	System.out.println("t2");
			 }
		 });
		 Thread t3 = new Thread(new Runnable() {
    
    
			 @Override
			 public void run() {
    
    
			 try {
    
    
			 	// 引用t2线程,等待t2线程执行完
			 	t2.join();
			 } catch (InterruptedException e) {
    
    
			 	e.printStackTrace();
			 }
			 	System.out.println("t3");
			 }
		 });
		 t3.start();//这里三个线程的启动顺序可以任意,都可以按照t1,t2,t3的顺序执行,大家可以试下!
		 t2.start();
		 t1.start();
	 }
}

总结

Java中保证线程按照一定顺序运行,可以利用 Thread.join() ,学习的时候要先好好理解 join() 方法的含义。

扫描二维码关注公众号,回复: 14759280 查看本文章

希望对大家有用!

猜你喜欢

转载自blog.csdn.net/qq_46119575/article/details/129444324