进程与线程
进程:在执行中的程序,描述的是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
早期的操作系统将进程作为并发执行的基本单位,此时进程具有以下两个基本属性:
- 拥有资源的基本单位
- 调度的基本单位
故此时不宜频繁切换进程,否则时空开销过大,限制了并发程度。
为了提高并发度以及减少系统开销,将进程的两个基本属性分离,引入线程作为调度的基本单位,只拥有少量必须的资源。
CPU调度
- 非抢占方式
- 抢占方式
- 时间片原则
- 优先权原则
- 短作业优先原则
注:Java多线程使用抢占式调度。
同步与异步
同步:排队执行,效率低但是数据安全
异步:同时执行,效率高但是数据不安全
并发与并行
并发:指两个或多个事件在同一时间段内发生。
并行:指两个或多个事件在同一时刻发生。
线程创建的三种方式
- 继承Thread类,重写run方法,通过start方法启动任务
- 实现Runnable接口,实现run方法,将任务作为参数传给Thread对象
- 实现Callable接口,实现call方法,创建FutureTask对象,传入参数,通过Thread对象启动线程
方式2相比于方式1的好处:
- 适合多个线程同时执行相同任务的情况
- 避免单继承的局限性
- 任务与线程本身是分离的
- 线程池接受Runnable类型的任务,不接受Thread类型的线程
线程不安全的3种解决方案
- 同步代码块
- 同步方法
- 显式锁