为什么需要多线程
- 单核CPU->多核CPU->并行计算
- 实时性需求->线程是轻量级的进程,任务调度的最小单位,资源消耗比进程低
- 充分利用CPU资源,提升吞吐量
线程在Java中的应用
四种方式创建多线程:
- 继承Thread类(本质上是实现了Runnable接口)
- 实现Runnable接口扔到Thread构造方法(无返回值)
- 实现Callable接口/Future扔到Thread构造方法(有返回值)
- 线程池ThreadPool
最终调用Thread.start()方法启动线程。
多线程适用场景
线程池:资源管理、节省了创建和销毁线程的开销、提高响应速度
IO阻塞
线程的生命周期
- NEW:刚创建未启动
- RUNNABLE:可运行:就绪(可以抢时间片)和运行中(已经拿到了时间片)来回切换
- BLOCKED:等待锁
- WAITING:调用wait/join/park等方法的时候,调用notify/nofityAll/unpark返回
- TIMED_WAITNG:调用wait(参数)、sleep(参数)等
- TERMINATED:线程结束
join()
- join()方法是调用join()的线程先执行!!理解为插队,谁join(),则谁插队先执行!当前的线程会阻塞住。