目录
线程的优势
线程的风险
JAVA 中线程创建方式
线程的调度
线程的状态
线程的优势
1 发挥多处理器的强大能力(CPU 基本调度单位是线程, 如果在单核下, 使用多线程可以提高吞吐量, 多核下, 使用多线程能更高的利用 CPU 资源)
2 建模的简单性
3 异步事件的简化处理
4 响应更灵敏的用户界面
线程的风险
1 安全性 (永远不发生糟糕的事情) 问题 多个线程的操作执行顺序是不可预测的, 甚至会产生奇怪的结果(导致原因: CPU, 缓存行, 内存)
2 活跃性 (某件正确的事情最终会发生) 问题
2.1 死锁 两个或两个以上线程在执行过程中, 由于竞争资源或者由于批次通信而造成的一种阻塞的详细, 若无外力作用, 它们将无法推进下去(例如: 两辆车在一条马路上互不想让)
2.2 活锁 任务或者执行没有被阻塞, 由于某些条件没有满足, 导致一直重复尝试 - 失败 - 尝试 - 失败的过程(例如: 两辆车在一条那路上相互谦让, 你让我走, 我让你走, 一直谦让)
2.3 饥饿 如果一个线程因为 CPU 时间全部被其它线程抢走而得不到 CPU 运行时间, 这种状态被称为 "饥饿"(例如: 过马路, 别人总是抢在我前面走, 导致我一直过不了)
3 性能 (正确的事情尽快发生) 问题(主要是线程的开销)
3.1 上下文切换 CPU 通过时间片的分配算法来循环执行任务, 当前任务执行一个时间片后会切换到下一个任务, 在切换前会保存上一个任务的状态, 以便下次切换这个任务
JAVA 中线程的创建方式
1 创建 Tread 的自雷
2 实现 Runnable 的接口
3 使用 ExecutorService,Callable,Future 实现有返回结果的多线程 nable 接口
线程的调度
1 抢占式调度 每条线程执行的时间, 线程的切换都由系统的控制(一个线程的堵塞不会导致整个进程的堵塞)
2 协同式调度 每一条线程执行完完后主动通知系统切换到另一条线程上执行(可能导致整个系统崩溃)
线程的状态
新建状态(New) 线程对象被创建后, 就进入了新建状态
就绪状态 (Runnable) 线程对象被创建后, 其它线程调用了该对象的 start() 方法, 从而启动该线程
运行状态(Running) 线程获取 CPU 权限进行执行, 线程只能从就绪状态进入到运行状态
阻塞状态(Blocked) 阻塞状态是线程因为某种原因放弃 CPU 使用权, 暂时停止运行, 知道线程进入就绪状态, 才有机会转到运行状态
等待阻塞 通过调用线程的 wait()方法, 让线程等待某工作的完成
同步阻塞 线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用), 它会进入同步阻塞状态
其它阻塞 通过调用线程的 sleep()或 join()或发起 IO 请求时, 线程会进入到阻塞状态, 当 sleep()状态超时, join()等待线程终止或者超时, 或者 IO 处理完毕时, 线程重新转入就绪状态
死亡状态 (Dead) 线程执行完了或者因异常退出了 run()方法, 该线程结束生命周期
来源: http://www.bubuko.com/infodetail-2893919.html