jdk源码学习之路之Thread和Runable

线程的几个状态 NEW 新建状态  RUNABLE 就绪状态  RUNNING 运行状态 BLOCKED 阻塞状态 DEAD 终止状态

NEW 状态通过start() 进入就绪状态 获得时间片进入RUNNING 状态 

阻塞状态产生 主动睡眠主动wait 等待IO资源等等

阻塞状态解除 IO资源释放 同步代码块释放 睡眠时间结束 notify 进行唤醒

实现Callable接口可以带返回值 

通过源码我们发现Thread是Runable的子类即是具体实现

Runable 接口 

我们会发现Runable只提供一个抽象方法 表示一个线程普通调用

Thread 提供了很多构造方法 接受接口类型 线程分组

线程名称 

线程名称用volatile修饰表示对其他线程可见线程安全

yield()方法表示 使当前线程从执行状态(运行状态)变为可执行态(就绪状态)让出cpu

表示当前线程让出CPU但是不放弃锁

start()表示一个开启一个线程并且使其进入就绪状态(可执行)得到时间片就开始执行run方法

中断线程 首先检查权限

调用线程的wait(), wait(long)或wait(long, int)会让它进入等待(阻塞)状态,或者调用线程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也会让它进入阻塞状态。若线程在阻塞状态时,调用了它的interrupt()方法,那么它的“中断状态”会被清除并且会收到一个InterruptedException异常

join底层调用的wait方法它会释放对象锁,而sleep则不会释放对象锁,只有同步方法执行完毕,其他线程才能执行

thread的wait是继承Object 通过notify进行唤醒

ThreadPoolExecutor创建线程池

创建一个线程池需要初始化的一些参数

corePoolSize 表示常驻核心线程数 如果等于0表示任务执行后没有任何请求进入时销毁线程池线程如果大于0不会被销毁

maximumPoolSize 表示线程池同时执行的最大线程数必须大于等于1 和corePoolSize相等的话表示固定大小线程池

keepAliveTime 表示线程池空闲时间当达到keepAliveTime时线程则会被销毁直至和corePoolSize相等线程数大于corePoolSize时

这个参数设置才会生效 allowCoreThreadTimeOut设置true达到时间时核心线程也会被收回

TimeUnit时间单位通常是TimeUnit.SECONDS

workQueue表示缓存队列当请求线程数大于maximumPoolSize线程会进入BlockingQueue阻塞队列

threadFactory表示线程工厂可以用来生产一组相同任务的线程

handler表示执行拒绝策略对象当线程数超过任务缓存队列上限时可以通过此策略处理请求,这是一个限流保护策略

保存到数据库进行削峰填谷。空闲时间再提取出来执行

转向某个提示页面

打印日志

Executors的核心方法

Executors.newWorkStealingPool创建足够的线程支持足够的并行度并通过多个队列减少竞争CPU数量设置默认并行度

jdk1.8时候才加入此方法

Executors.newCachedThreadPool  maximumPoolSize 最大可以至Integer.MAX_VALUE 是可以高度伸缩的线程池

相信达到最大值什么处理器也凉了吧 肯定会抛出OOM 异常 keepAliveTime默认设置60秒

Executors.newScheduledThreadPool 线程数最大Integer.MAX_VALUE 与newChachedThreadPool相同它是ScheduledExecutorService的实现类支持定时周期性的执行任务他不回收线程

Executors.newSingleThreadExecutor创建一个单线程的线程池相当于单线程执行所有任务保证任务按照提交顺序依次执行

Executors.newFixedThreadPool输入的参数即是固定的线程数即是核心线程数也是最大线程数不存在空闲线程所以keepAliveTime等于0

ThreadPoolExecutor四种内部静态类

AbortPolicy丢弃任务并且抛出RejectedExecutionException异常

DiscardPolicy 丢弃任务不抛出异常

DiscardOldestPolicy丢弃最早的任务最早的任务把当前任务加入队列

CallRunsPolicy 调用任务run() 绕过线程池直接执行

猜你喜欢

转载自blog.csdn.net/m0_38105216/article/details/85108684