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 查看本文章
希望对大家有用!