news 2026/7/15 20:52:22

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《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!
👉 点击关注我,更新后第一时间收到推送!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 20:47:55

2026年云计算运维实战:Docker与Kubernetes全链路技能指南

如果你正在考虑进入云计算运维领域&#xff0c;或者已经是一名运维工程师但感觉技术栈更新太快跟不上节奏&#xff0c;那么这篇文章就是为你准备的。2026年的IT行业&#xff0c;Docker和Kubernetes&#xff08;k8s&#xff09;依然是容器化和云原生技术的核心支柱&#xff0c;但…

作者头像 李华
网站建设 2026/7/15 20:41:55

命名空间:面试官问“using namespace std到底好不好”,我差点说错

上篇聊了异常处理&#xff0c;C基础语法部分进入尾声了。今天讲一个看起来简单但争议不小的话题——命名空间。命名空间在面试里很少单独考&#xff0c;但面试官会通过"using namespace std"这个问题来试探你的工程素养。你回答得好&#xff0c;面试官觉得你有大项目…

作者头像 李华
网站建设 2026/7/15 20:40:27

别再用默认设置跑 Claude Code 了:12 个需要立刻开启的配置

大多数开发者装完 Claude Code 之后&#xff0c;直接开始敲提示词&#xff0c;从来没看过有哪些可配置的选项。这其实是个不小的浪费——默认安装虽然能用&#xff0c;但错过了很多"如果早知道就会打开"的功能。 Claude Code 的配置分布在两处&#xff1a;一部分在 …

作者头像 李华
网站建设 2026/7/15 20:40:00

Audacity音频编辑神器:5个步骤从零开始创作专业音频作品

Audacity音频编辑神器&#xff1a;5个步骤从零开始创作专业音频作品 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 还在为复杂的音频编辑软件而烦恼&#xff1f;想要一款功能强大又完全免费的工具来制作播客、编…

作者头像 李华
网站建设 2026/7/15 20:38:35

模板驱动型文档自动化:从内容到专业PDF的确定性工作流

1. 项目概述&#xff1a;当模板成为文档生产的“操作系统”你有没有过这种经历&#xff1a;手头有一篇写得不错的行业分析&#xff0c;想快速做成一份体面的PDF报告发给客户&#xff1b;或者刚整理完一套培训资料&#xff0c;急需打包成电子书作为课程配套材料&#xff1b;又或…

作者头像 李华
网站建设 2026/7/15 20:38:09

8051存储空间深度解析:从哈佛结构到SFR位寻址的实战指南

1. 哈佛结构&#xff1a;8051存储设计的灵魂所在第一次接触8051单片机时&#xff0c;最让我困惑的就是为什么程序和数据要分开存储。直到在项目里调试一个实时数据采集系统时&#xff0c;才真正理解哈佛结构的精妙之处——当时程序正在从Flash读取滤波算法代码的同时&#xff0…

作者头像 李华