
java多线程实现顺序执行在 Java 编程里多线程是一项强大的特性它允许程序同时执行多个任务从而提升程序的性能和响应能力。不过有时候我们希望多个线程能够按照特定的顺序依次执行而不是并发地随机执行。这篇博客会为 Java 详细介绍几种按意愿依次执行线程的方法。1. 线程顺序执行的概念正常情况下Java 中的线程一旦启动就会在操作系统的调度下并发执行它们的执行顺序是不确定的。但在某些场景中我们需要保证线程按照特定的顺序依次执行比如线程 A 执行完之后线程 B 才能执行线程 B 执行完之后线程 C 才能执行。2.多线程中两种特殊的优先级设置方法Java多线程库中有yield() 方法和 setPriority() 方法可以用于尝试控制线程的执行顺序。不过需要注意的是yield() 和 setPriority() 并不能严格保证线程按意愿依次执行它们只是给线程调度器提供一些建议。这里先简单介绍一下这两种方法的使用2.1.yield方法yield() 是 Thread 类的一个静态方法当一个线程调用 yield() 方法时它会告诉线程调度器自己愿意让出当前的 CPU 执行权让其他具有相同优先级的线程有机会执行。但这只是一个建议线程调度器可能会忽略这个建议继续让当前线程执行。下面这段代码将t1设置为礼让线程但是实际执行时输出结果大多还是Thread 1,效果很不明显public class Test01 { public static void main(String[] args) { Thread t1 new Thread(() - { Thread.yield(); System.out.println(Thread 1); }); Thread t2 new Thread(() - { System.out.println(Thread 2); }); Thread t3 new Thread(() - { System.out.println(Thread 3); }); t1.start(); t2.start(); t3.start(); } }2.2.setPriority方法setPriority() 是 Thread 类的一个实例方法用于设置线程的优先级。线程的优先级范围是 1 到 10其中 1 是最低优先级10 是最高优先级默认优先级是 5。线程调度器会倾向于让优先级高的线程先执行但这也不是绝对的。下面这段代码将t1线程优先级设为最低但是实际执行时t1线程仍然经常第一个执行效果同样不是很明显public class Test01 { public static void main(String[] args) { Thread t1 new Thread(() - { System.out.println(Thread 1); }); Thread t2 new Thread(() - { System.out.println(Thread 2); }); Thread t3 new Thread(() - { System.out.println(Thread 3); }); t1.setPriority(Thread.MIN_PRIORITY); t1.start(); t2.start(); t3.start(); } }3. 使用 join() 方法3.1 join() 方法的原理join() 方法是 Thread 类的一个实例方法。当在一个线程中调用另一个线程的 join() 方法时当前线程会被阻塞直到被调用 join() 方法的线程执行完毕。也就是说A线程等待B线程执行完毕就需要在A线程中令B线程调用join方法3.2 示例代码public class Main { public static void main(String[] args) { Thread t1 new Thread(() - { System.out.println(Thread 1); }); Thread t2 new Thread(() - { try { t1.join(); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(Thread 2); }); Thread t3 new Thread(() - { try { t2.join(); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(Thread 3); }); t1.start(); t2.start(); t3.start(); } }这段代码就可以实现严格控制线程的执行无论执行多少次永远都是线程t1,t2,t3依次执行。4. 使用线程锁synchronized对于线程锁实现多线程的顺序执行我们先直接看代码4.1.示例代码public class OrderedExecution { private static final Object lock new Object(); private static int current 1; // 控制执行顺序的状态变量 public static void main(String[] args) { Thread t1 new Thread(() - { synchronized (lock) { while (current ! 1) { // 检查是否轮到自己执行 try { lock.wait(); // 不是则等待 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(线程1执行); current 2; // 更新状态变量 lock.notifyAll(); // 唤醒其他线程 } }); Thread t2 new Thread(() - { synchronized (lock) { while (current ! 2) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(线程2执行); current 3; lock.notifyAll(); } }); Thread t3 new Thread(() - { synchronized (lock) { while (current ! 3) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(线程3执行); current 1; lock.notifyAll(); } }); t1.start(); t2.start(); t3.start(); } }4.2.代码解析先通过current变量初始值为1明确标记当前应执行的线程序号在每个线程进入同步块后会循环检查current是否匹配自己的序号不匹配则调用wait()释放锁并等待执行完的线程会更新current并调用notifyAll()确保只有下一个序号对应的线程能通过条件检查需要注意的是这里的wait不能用sleep方法代替因为sleep方法在睡眠时不会释放锁从而导致死锁的形成5. 总结本文介绍了两种在 Java 中按意愿依次执行线程的方法join() 方法和 线程锁synchronized。join() 方法是最简单的实现多线程顺序执行的方法适合线程数量较少的场景synchronized 则更灵活适用于复杂的线程协作场景。除此之外还有CountDownLatch单线程线程池等常用方法可以实现多线程的顺序执行 通过这些方法可以更好地控制线程的执行顺序编写出更稳定、可靠的多线程程序。