多线程学习笔记-1
1、Java线程状态
- 新建
- 可运行:可能正在运行,也可能正在等待 CPU 时间片
- 等待(Waiting):等待其它线程显式地唤醒,否则不会被分配 CPU 时间片
- 计时等待(Timed Waiting):无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。
- 阻塞
- 死亡
操作系统的线程状态
- 新建
- 运行
- 阻塞
- 等待
- 死亡
使用自旋锁时,线程请求资源失败并不会直接阻塞,而是空转一段时间,此时线程处于运行状态,只是什么也不会做。
2、线程创建方式
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
之前有一个误会,CompletableFuture 也是创建线程的一种方式,但是实际不是,它是提供了异步编程,允许我们在不阻塞线程的同时,执行异步操作,并通过回调函数处理结果或异常。它依赖于 Executor 来提供线程执行异步任务。当使用 CompletableFuture 的方法如supplyAsync 或 runAsync 时,需要显式地提供一个 Executor,或者依赖 CompletableFuture 默认使用的 ForkJoinPool 来执行任务。
ExecutorService,接口,继承了Executor接口,里面提供了线程的提交,关闭,线程的状态判断等方法。
3、线程互斥和同步
Java提供两种线程锁机制来控制多个线程对共享资源的互斥访问
1、synchronized,可定义到类,方法,代码块上,依照里面锁的形式,分别可以锁住整个类或对象
2、ReentrantLock
使用选择
除非需要使用 ReentrantLock 的高级功能,否则优先使用 synchronized。这是因为 synchronized 是 JVM 实现的一种锁机制,JVM 原生地支持它,而 ReentrantLock 不是所有的 JDK 版本都支持。并且使用 synchronized 不用担心没有释放锁而导致死锁问题,因为 JVM 会确保锁的释放。
4、锁
参考:https://pdai.tech/md/java/thread/java-thread-x-overview.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律