线程
线程是依附于进程的,而进程是分配资源的基本单位,一个进程可以生成多个线程,这些线程有共享的进程资源。
为什么需要多线程
- CPU非常快
- 现代CPU是多核的
- Java执行模型是同步/阻塞的
- 默认情况下只有一个线程
线程的创建运行
- 创建
- 创建
Thread的子类并重写run() - 实现
Runnable接口
- 创建
- 运行 - 使用
start()而不是直接使用run()
Main线程和子线程关系
-
Main线程是个非守护线程,不能设置成守护线程(由jvm创建,运行时不能操作Thread.setDaemon()) -
Main线程结束后,子线程可以正常运行(Main线程只是个普通的非守护线程)
并发和并行
- 并发:一个处理器同时处理多个任务(逻辑上的同时发生)
- 并行:多个处理器同时处理不同任务(物理上的同时发生)
线程的生命周期
Java线程有 **新建(NEW)、就绪(RUNNABLE)、阻塞(BLOCKED)、无时限等待(WAITING)、有时限等待(TIMED_WAITING)、和死亡(TERMINATED)**6种状态。
-
NEW- 创建了新线程,但还没有开始执行 -
RUNNABLE- 正在执行(running)或等待执行(ready to run) -
BLOCKED- 因等待监视器锁(monitor lock)而阻塞 -
WAITING- 无时限等待其他线程调用下面的方法可以进入这个状态:
Object.wait()Thread.join()LockSupport.park()
-
TIMED_WAITING- 有时限等待其他线程- 调用带超时参数的
Thread.sleep(long millis)方法; - 获得
synchronized隐式锁的线程,调用带超时参数的Object.wait(long timeout)方法; - 调用带超时参数的
Thread.join(long millis)方法; - 调用带超时参数的
LockSupport.parkNanos(Object blocker, long deadline)方法; - 调用带超时参数的
LockSupport.parkUntil(long deadline)方法。
- 调用带超时参数的
-
TERMINATED- 执行完run()或执行run()时遇到异常退出