保证多个线程顺序执行
public class A implements Runnable { @Override public void run() { // TODO Auto-generated method stub System.out.println("A"); } } public class B implements Runnable { @Override public void run() { // TODO Auto-generated method stub System.out.println("B"); } } public class C implements Runnable { @Override public void run() { // TODO Auto-generated method stub System.out.println("C"); } } /** * 方法一: * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub Thread thread1 = new Thread(new A()); thread1.start(); thread1.join(); Thread thread2 = new Thread(new B()); thread2.start(); thread2.join(); Thread thread3 = new Thread(new C()); thread3.start(); }
使用join()方法,等前一个线程执行完毕,下一个线程才能执行
import java.util.ArrayList; import java.util.List; /** * 保证多个线程顺序执行 * @author 尘世间迷茫的小书童 * */ public class TestJoin { public static void main(String[] args) { List<Thread> threads = new ArrayList<>(); for(int i=0; i<100; i++) { threads.add(new Thread(() -> { System.out.println(Thread.currentThread().getName()); }, "线程"+i)); } threads.forEach(thread -> { thread.start(); try { thread.join(); //具体实现调用Object wait方法 } catch (InterruptedException e) { e.printStackTrace(); } }); } }
/** * 方法二: */ @Test public void test2() { //创建只有一根线程的线程池 ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(new A()); executorService.submit(new B()); executorService.submit(new C()); executorService.shutdown(); }
创建一个只有一根线程的线程池,保证所有任务按照指定顺序执行
/** * 线程顺序执行类 * @author 15735400536 * */ public class StepOver { private volatile int count = 1; public void a() throws InterruptedException { synchronized (this) { while(count != 1) { wait(); } System.out.println("线程A"); count = 2; notifyAll(); // if(count == 1) { // System.out.println("线程A"); // count = 2; // //Thread.currentThread().notifyAll(); // notifyAll(); // }else { // //Thread.currentThread().wait(1000); // wait(); // } } } public void b() throws InterruptedException { synchronized (this) { while(count != 2) { wait(); } System.out.println("线程B"); count = 3; notifyAll(); // if(count == 2) { // System.out.println("线程B"); // count = 3; // //Thread.currentThread().notifyAll(); // notifyAll(); // }else { // //Thread.currentThread().wait(1000); // wait(); // } } } public void c() throws InterruptedException { synchronized (this) { while(count != 3) { wait(); } System.out.println("线程C"); count = 1; notifyAll(); // if(count == 3) { // System.out.println("线程C"); // count = 0; // //Thread.currentThread().notifyAll(); // notifyAll(); // }else { // //Thread.currentThread().wait(1000); // wait(); // } } } } public class ThreadA implements Runnable { private StepOver stepOver; public ThreadA(StepOver stepOver) { this.stepOver = stepOver; } @Override public void run() { // TODO Auto-generated method stub try { stepOver.a(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class ThreadB implements Runnable { private StepOver stepOver; public ThreadB(StepOver stepOver) { this.stepOver = stepOver; } @Override public void run() { // TODO Auto-generated method stub try { stepOver.b(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class ThreadC implements Runnable { private StepOver stepOver; public ThreadC(StepOver stepOver) { this.stepOver = stepOver; } @Override public void run() { // TODO Auto-generated method stub try { stepOver.c(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 方法三 */ @Test public void test3() { StepOver stepOver = new StepOver(); for(int i=0; i<10 ; i++) { Thread b = new Thread(new ThreadB(stepOver)); b.start(); Thread a = new Thread(new ThreadA(stepOver)); a.start(); Thread c = new Thread(new ThreadC(stepOver)); c.start(); } }
面试的时候,面试官问你怎么保证多个线程顺序执行多半都是考察多线程的join方法,join方法的实现调用了Object的wait方法,所以上面说到的方法1和方法3本质上是相通的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义