1. 线程和进程区别
线程的划分尺度小于进程,这使多线程程序拥有高并发性,进程在运行时各内存单元之间相互独立,线程之间内存共享,这使多线程拥有更好的性能和用户体验。
- 线程
是进程的一个实体,是 cpu 调度和分派的基本单位,是比进程更小的可以独立运行的基本单位。
- 进程
具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个基本单位。
2. 创建线程方式
- 继承 Thread 类重写 run(),简单单一,不能继承其他类。
- 实现 Runnable 接口重写 run(),避免单继承局限性,灵活解耦。
- 实现 Callable 接口重写 call(),可以获取返回值,可以抛出异常。
- 线程池创建,Executor 接口。
3. Runnable 和 Callable 区别
- Runnable 无返回值;Callable 有返回值,支持泛型。
- Runnable 只能抛出运行时异常,且不能捕获;Callable 反之。
4. start() 和 run() 区别
start() 可以启动线程,使线程进入就绪状态;run() 只是 Thread 的一个普通方法,在主线程中执行。
5. 线程的状态
- 新建
生成线程对象
- 就绪
调用了 start()
- 运行
将就绪状态的线程设为当前线程,运行 run()
- 阻塞
线程因为某种原因放弃 cpu 使用权,暂时停止运行,直到线程重新进入到就绪状态,才有机会转到运行状态。
-
- 等待
- 调用 wait() 使线程等待某工作完成
- 超时等待
- 调用 sleep() 或 join() 或发出了 I/O 请求,线程进入阻塞状态,当 sleep() 状态超时、join() 等待线程终止或超时、I/O 处理完毕,线程重新进入就绪状态。
- 同步阻塞
- 线程获取 synchronized 同步锁失败
- 死亡
线程执行完毕或异常退出,线程结束生命周期
6. 线程相关方法
- 线程等待(wait)
调用该方法的线程进入 waiting 状态,等待其他线程通知或被中断才会返回,会释放锁,一般用于同步方法或同步代码块中。
- 线程睡眠(sleep)
导致线程进入 time-waiting 状态,不会释放当前持有的锁。
- 线程让步(yield)
使当前线程让出 cpu 执行权,与其他线程重新竞争。
- 线程中断(interrupt)
本意是给线程一个中断的信号,会影响线程内部的一个中断标识位,线程本身并不会因此而改变状态。
- 线程加入(join)
使线程执行完 run() 方法后,再执行 join() 方法后面的代码。
- 线程唤醒(notify)
随机唤醒等待的单个线程,notifyAll() 唤醒所有线程。
7. wait() 和 sleep() 区别
- wait() 来自 Object 类;sleep() 来自 Thread 类。
- wait() 会释放锁;sleep() 不会。
- wait() 必须在同步方法或同步代码块中使用;sleep() 任何地方可用。
- wait() 不需要捕获异常;sleep() 需要。
8. 线程池优点
- 使用线程池可以重复使用已有线程,避免了线程在创建和销毁所造成的损耗
- 没有创建和销毁的损耗,提高了系统响应速度
- 对线程进行管理,如根据系统承受能力调整可运行线程数量大小等
9. 线程池分类
- newCachedThreadPool
创建一个带缓存可重复利用的线程池
- newFixedThreadPool
创建一个可重用、固定线程数量的线程池
- newSingleThreadExecutor
创建一个单线程的线程池
- newScheduledThreadPool
创建一个线程池,支持延时和定期执行
10. 线程池的核心参数
- corePoolSize:核心线程数
- maximumPoolSize:最大线程数
- keepAliveTime:空闲线程存活时间
- unit:时间单位
- workQueue:阻塞队列
- threadFactory:创建线程的工程
- handler:拒绝策略
11. 线程池原理
当一个任务提交至线程池,首先判断核心线程数是否已满,没有则创建线程执行任务;否则放入阻塞队列,如果阻塞队列已满,判断最大线程数是否已满,没有则创建线程执行;否则将执行拒绝策略。
12. 拒绝策略
- AbortPolicy
系统默认,丢弃任务并抛 RejectedExecutionException 异常
- DiscardPolicy
丢弃任务,不抛异常,可能造成数据丢失
- DiscardOldestPolicy
丢弃最前面的任务(通常是存活时间最长的任务),并尝试重试执行,也有数据丢失风险
- CallerRunsPolicy
既不丢弃任务,也不抛异常,而是将某些任务回退给调用者,让调用者去执行
13. 线程池关闭
- shutdownNow
首先将线程池状态设置为 stop,然后尝试停止所有正在执行和未执行的线程,并返回等待执行任务列表
- shutdown
将线程池状态设置为 shutdown,然后中断所有未执行的线程
标签:执行,run,创建,sleep,线程,多线程,wait From: https://www.cnblogs.com/apachewang/p/16730910.html