code搬运工_深入多线程(v1)
2019-04-08 本文已影响0人
自由的灯塔
Runnable与Callable接口的方式创建多线程的特点 :
- 线程类只是实现了Runnable接口或Callable接口,还可以继承其它类
- 在这种方式下 , 多个线程可以共享一个target对象 , 所以非常适合多个线程来处理同一份资源情况
- 如果需要访问当前线程,需要使用Thread.currentThread方法
- Callable接口与Runnable接口相比,只是Callable接口可以返回值而已(future)
Thread类的方式创建多线程的特点 :
- 因为线程已经继承Thread类,所以不可以再继承其它类
- 如果需要访问当前线程,直接使用this即可
线程池
Thread 弊端 :
- 性能差,缺乏统一管理,相互竞争,占用过多系统资源,导致死机或OOM
线程池ThreadPoolExecutor 优势 :
- 重用线程,减少创建和销毁,性能好
- 有效控制最大并发,提高系统资源利用率,避免过多资源竞争,避免阻塞
- 提供定时定期执行、单线程、并发数控制的功能
相关参数 :
- corePoolSize:核心线程数
- maximumPoolSize:线程最大线程数
- workQueue:阻塞队列,存储等待执行任务
- KeepAliveTime:线程没有任务执行时最久保持多久时间终止
- unit:KeepAliveTime的时间单位
- threadFactory:线程工厂,用来创建线程
- rejectHandler:当拒绝处理任务时策略
线程池状态 :
- runing:接收新提交的任务和阻塞队列中任务
- shutdown:关闭,不能接收新提交任务,可以处理阻塞队列中缓存任务
- stop:关闭,不接收新提交任务和阻塞状态中的任务
- tidying:任务结束,有效线程数数为0
- terminated:线程池内部处理
相关方法 :
- execute():提交任务,交给线程池执行
- submit():提交任务,能够返回执行结果 execute+future
- shutdown():关闭线程池,等待任务处理完
- shutdownNow():关闭线程池,不等待任务处理完
- getTaskCount():线程池已执行和未执行的任务总数
- getCompletedTaskCount():已完成任务数量
- getPoolSize():线程池当前线程数量
- getActiveCount():当前线程中正在执行任务的线程数量
相关类库 :
- Executors
- ThreadPoolExecutor ScheduledThreadPoolExecutor
什么是线程池 :
- 根据一组执行策略的调用、调度、执行和控制的异步任务框架
- 提供一种任务提交和运行分离机制
- 接口: Executor、ExcutorService、ScheduledExecutorService
四种线程池 :
- newCachedThreadPool
可缓存线程池,线程池长度超出需要,可以灵活处理空闲线程,没有可回收的则新建线程
在线程池空闲时,即线程池中没有可运行任务时,它会释放工作线程,从而释放工作线程所占用的资源
当出现新任务时,又要创建新的工作线程,这会带来一定的系统开销。
并且在使用CachedThreadPool时,一定要注意控制任务的数量,否则大量线程同时运行,可能会造成系统瘫痪 - newFixedThreadPool
定长线程池,控制最大并发数,超出线程在队列等待
具有线程池的高效率和节省创建线程时所耗的开销的优点。
在线程池空闲时,即线程池中没有可运行任务时,
它不会释放工作线程,还会占用一定的系统资源。 - newScheduledThreadPool
定长线程池,定时、周期性任务执行 - newSingleThreadExecutor
单线程化线程池,用唯一的线程执行任务,保证所有任务按照指定顺序执行若有多余的任务提交到线程池中,则会被暂存到阻塞队列.待空闲时再去执行。按照先入先出的顺序执行任务。