Java基础复习笔记(五)

Java死锁

原因
一个资源只能被一个线程使用;
一个线程唉阻塞或者等待某个资源时,不释放已占用资源;
一个线程已获得的资源,在未使用完之前,不能强行剥夺;
若干线程形成头尾相接的循环等待资源关系;
避免
注意加锁顺序,保证每个线程按同样的顺序进行加锁;
注意加锁时限,可以针对锁设置一个超时时间;
注意死锁检查,确保在第一时间发现死锁并解决 。
 

线程池的好处

降低了资源消耗;提高了线程利用率,降低创建和小虎线程的消耗;
提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程再执行;
提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控;
 

线程池参数

corePoolSize 代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后不会献出,而是一种常驻线程;
maxinumPoolSize 代表最大线程数,与核心线程数相对应,表示最大允许被创建的线程数;
keepAliceTime、unit 表示产出核心线程数之外的线程的空闲存活时间,也就是核心线程不会消除,但是超出核心线程数的部分线程如果空闲状态一定时间就会被消除,可以通过setKeepAliveTime来设置空闲时间;
workQueue 用来存放待执行的任务,核心线程都已经被使用,还有任务进来则全部放入队列,直到整个队列被放满但是任务还在持续进入则开始创建i新的线程;
ThreadFactory 实际上是一个线程工厂,用来生产线程执行任务。
Handler 人物拒绝策略,有两种情况,一种是电泳shutdown方法关闭线程池后,这时候及时线程池内还没有执行完的任务正在执行,由于线程池已经关闭,再继续向线程池提交任务就会被拒绝。另一种是打到最大线程数,线程池已经没有能力在继续处理新提交的任务会拒绝。
 

线程池处理流程

在这里插入图片描述

线程池中阻塞队列的作用,为什么是先添加队列而不是创建最大线程?

1.一般的队列只能保证最为一个有限长度的缓冲区,如果超出了缓冲区,就无法保留当前的任务,阻塞队列通过阻塞可以包六中想要继续入队的的任务;阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源。
2.在创建新的线程是,是要获取全局锁的,这个时候其他的就得阻塞,影响整体效率。
 

线程池中线程复用原理

线程池讲线程和任务进行解耦,线程是线程,任务是任务,摆脱了之前通过Thread创建线程时一个线程必须对应一个任务的限制。
在线程池中,同一个线程可用冲阻塞队列中不断获取新任务来执行,其核心原理在于线程池对Thread进行了封装,并不是每次执行都会调用Thread.start()来创建新线程,而是让每个线程去不停检查是否有任务需要被执行,如果有则直接执行,也就是调用任务中的run方法,通过这种方式将所有任务的run方法串联起来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值