《Java 100 天进阶之路》第60.4篇:多线程代码示例集(2026版)
第60.4篇:多线程代码示例集(2026版)
📌系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第60.3篇:多线程生产环境避坑清单 |
➡️ 下一篇:第61篇:JVM内存区域(待发布)
🗺️ 本文阅读地图(2 分钟速览)
多线程面试不仅问原理,还要写代码。本文汇总 10 个可直接背诵的代码模板,覆盖线程创建、锁使用、线程池、异步编排、原子类、ThreadLocal 等所有场景:
| 分类 | 代码模板数量 |
|---|---|
| 线程创建 | 2 个模板 |
| 锁与并发工具 | 3 个模板 |
| 线程池 | 2 个模板 |
| 异步编程 | 1 个模板 |
| 原子类与 CAS | 1 个模板 |
| ThreadLocal | 1 个模板 |
文章目录
- 第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!
👉 点击关注我,更新后第一时间收到推送!
