《Java 100 天进阶之路》第60.4篇:多线程代码示例集(2026版)

第60.4篇:多线程代码示例集(2026版)

📌系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第60.3篇:多线程生产环境避坑清单 |
➡️ 下一篇:第61篇:JVM内存区域(待发布

🗺️ 本文阅读地图(2 分钟速览)

多线程面试不仅问原理,还要写代码。本文汇总 10 个可直接背诵的代码模板,覆盖线程创建、锁使用、线程池、异步编排、原子类、ThreadLocal 等所有场景:

分类代码模板数量
线程创建2 个模板
锁与并发工具3 个模板
线程池2 个模板
异步编程1 个模板
原子类与 CAS1 个模板
ThreadLocal1 个模板

文章目录

    • 第60.4篇:多线程代码示例集(2026版)
      • 🗺️ 本文阅读地图(2 分钟速览)
      • 模板1:线程创建方式
        • 方式一:继承 Thread
        • 方式二:实现 Runnable(推荐)
        • 方式三:实现 Callable(有返回值)
        • 方式四:线程池 + 虚拟线程
      • 模板2:synchronized 三种用法
        • 用法一:修饰实例方法(锁 this)
        • 用法二:修饰静态方法(锁 Class)
        • 用法三:修饰代码块(粒度最细)
      • 模板3:ReentrantLock 标准模板
        • 独占锁
        • tryLock 超时模板(防死锁)
      • 模板4:死锁演示代码(面试手写)
      • 模板5:线程池标准创建模板
      • 模板6:CompletableFuture 异步编排
      • 模板7:原子类使用
        • AtomicInteger 计数器
        • LongAdder 高并发计数器
        • AtomicStampedReference(ABA 解决)
        • AtomicIntegerFieldUpdater(零内存开销)
      • 模板8:ThreadLocal 标准用法
        • 基础用法 + remove
        • 静态 ThreadLocal + 初始化
        • 跨线程池传递(TTL)
    • 📊 你的学习进度
    • 👉 下一篇文章预告

模板1:线程创建方式

方式一:继承 Thread
classMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("线程: "+Thread.currentThread().getName());}}newMyThread().start();
方式二:实现 Runnable(推荐)
Runnabletask=()->System.out.println("线程: "+Thread.currentThread().getName());newThread(task).start();
方式三:实现 Callable(有返回值)
Callable<String>task=()->{Thread.sleep(1000);return"结果";};FutureTask<String>ft=newFutureTask<>(task);newThread(ft).start();Stringresult=ft.get();// 阻塞获取结果
方式四:线程池 + 虚拟线程
// 传统线程池ExecutorServicepool=newThreadPoolExecutor(5,10,60L,TimeUnit.SECONDS,newArrayBlockingQueue<>(100),r->newThread(r,"biz-pool-%d"),newThreadPoolExecutor.CallerRunsPolicy());pool.execute(()->System.out.println("任务"));// 虚拟线程(JDK 21+)Thread.startVirtualThread(()->System.out.println("虚拟线程"));ExecutorServicevPool=Executors.newVirtualThreadPerTaskExecutor();vPool.submit(()->System.out.println("虚拟线程池任务"));

模板2:synchronized 三种用法

用法一:修饰实例方法(锁 this)
publicsynchronizedvoidmethodA(){// 同一实例的 synchronized 方法互斥}
用法二:修饰静态方法(锁 Class)
publicstaticsynchronizedvoidmethodB(){// 该类的所有实例互斥}
用法三:修饰代码块(粒度最细)
privatefinalObjectlock=newObject();publicvoidmethodC(){synchronized(lock){// 只锁这部分}}

模板3:ReentrantLock 标准模板

独占锁
ReentrantLocklock=newReentrantLock();lock.lock();try{// 业务逻辑}finally{lock.unlock();// 必须在 finally 中释放}
tryLock 超时模板(防死锁)
ReentrantLocklockA=newReentrantLock();ReentrantLocklockB=newReentrantLock();if(lockA.tryLock(1,TimeUnit.SECONDS)){try{if(lockB.tryLock(1,TimeUnit.SECONDS)){try{// 两把锁都拿到,执行业务}finally{lockB.unlock();}}}finally{if(!lockB.isHeldByCurrentThread()){lockA.unlock();// 获取B失败,释放A}}}else{// 超时处理}

模板4:死锁演示代码(面试手写)

publicclassDeadlockDemo{privatestaticfinalObjectA=newObject();privatestaticfinalObjectB=newObject();publicstaticvoidmain(String[]args){newThread(()->{synchronized(A){try{Thread.sleep(100);}catch(InterruptedExceptione){}synchronized(B){System.out.println("线程1 获取B");}}}).start();newThread(()->{synchronized(B){try{Thread.sleep(100);}catch(InterruptedExceptione){}synchronized(A){System.out.println("线程2 获取A");}}}).start();}}

模板5:线程池标准创建模板

publicclassAsyncThreadPool{privatestaticfinalintCPU_CORES=Runtime.getRuntime().availableProcessors();// IO 密集型线程池publicstaticfinalExecutorServiceIO_POOL=newThreadPoolExecutor(CPU_CORES*2,CPU_CORES*4,60L,TimeUnit.SECONDS,newArrayBlockingQueue<>(1000),r->newThread(r,"io-pool-"+System.currentTimeMillis()),newThreadPoolExecutor.CallerRunsPolicy());// CPU 密集型线程池publicstaticfinalExecutorServiceCPU_POOL=newThreadPoolExecutor(CPU_CORES,CPU_CORES+1,60L,TimeUnit.SECONDS,newArrayBlockingQueue<>(100),r->newThread(r,"cpu-pool-"+System.currentTimeMillis()),newThreadPoolExecutor.AbortPolicy());// 优雅关闭publicstaticvoidshutdown(ExecutorServicepool){pool.shutdown();try{if(!pool.awaitTermination(60,TimeUnit.SECONDS)){pool.shutdownNow();}}catch(InterruptedExceptione){pool.shutdownNow();Thread.currentThread().interrupt();}}}

模板6:CompletableFuture 异步编排

// 串行依赖CompletableFuture.supplyAsync(()->1).thenApply(x->x+1).thenApply(x->x*2).thenAccept(System.out::println);// 并行合并CompletableFuture<Integer>f1=CompletableFuture.supplyAsync(()->10);CompletableFuture<Integer>f2=CompletableFuture.supplyAsync(()->20);f1.thenCombine(f2,Integer::sum).thenAccept(System.out::println);// 多任务聚合 + 超时 + 异常CompletableFuture<Void>all=CompletableFuture.allOf(f1,f2,f3);all.completeOnTimeout(null,3,TimeUnit.SECONDS).exceptionally(e->{log.error("",e);returnnull;}).join();

模板7:原子类使用

AtomicInteger 计数器
AtomicIntegercount=newAtomicInteger(0);count.incrementAndGet();// 返回新值count.getAndIncrement();// 返回旧值count.compareAndSet(5,10);
LongAdder 高并发计数器
LongAdderadder=newLongAdder();adder.increment();adder.add(5);longtotal=adder.sum();// 弱一致性
AtomicStampedReference(ABA 解决)
AtomicStampedReference<String>ref=newAtomicStampedReference<>("A",0);int[]stamp=newint[1];Stringold=ref.get(stamp);ref.compareAndSet(old,"B",stamp[0],stamp[0]+1);
AtomicIntegerFieldUpdater(零内存开销)
classUser{volatileintage;}AtomicIntegerFieldUpdater<User>updater=AtomicIntegerFieldUpdater.newUpdater(User.class,"age");Useruser=newUser();updater.incrementAndGet(user);

模板8:ThreadLocal 标准用法

基础用法 + remove
publicclassThreadLocalDemo{privatestaticfinalThreadLocal<String>CONTEXT=newThreadLocal<>();publicvoidprocess(StringuserId){try{CONTEXT.set(userId);doBusiness();}finally{CONTEXT.remove();// 必须!}}privatevoiddoBusiness(){StringuserId=CONTEXT.get();// ...}}
静态 ThreadLocal + 初始化
privatestaticfinalThreadLocal<SimpleDateFormat>DATE_FORMAT=ThreadLocal.withInitial(()->newSimpleDateFormat("yyyy-MM-dd HH:mm:ss"));// 使用:DATE_FORMAT.get().format(new Date());
跨线程池传递(TTL)
// 引入依赖:com.alibaba:transmittable-thread-localTransmittableThreadLocal<String>ttl=newTransmittableThreadLocal<>();ttl.set("traceId");Runnabletask=TtlRunnable.get(()->System.out.println(ttl.get()));threadPool.submit(task);

📊 你的学习进度

  • 当前:第60.4篇 ·多线程专题外挂:代码示例集
  • ✅ 已完成:基础篇44篇 + 第45~60篇 + 第60.1~60.4篇
  • 📖 正在学:第60.4篇
  • ⏳ 待学习:第61~108篇

👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇

👉 下一篇文章预告

🚀下一篇:《第61篇:JVM内存区域》

内容简介:JVM 内存布局(堆、元空间、虚拟机栈、本地方法栈、程序计数器)、JDK 8 变化、各区域内存溢出场景与排查。

👉JVM 调优与故障排查专题正式开启!

📌《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!