线程池

线程池的类型

定时线程池(newScheduledThreadPool)
它主要用来在给定的延迟之后运行任务,或者定期执行任务,例如定时轮询数据库中的表的数据

缓存线程池(newCachedThreadPool)
没有核心线程,创建一个会根据需要创建新线程的,适用于执行很多的短期异步任务的小程序,或者是负载较轻的服务器
线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程

单例线程池(newSingleThreadExecutor)
保证执行顺序和只有单一的线程

固定数量线程池(newFixedThreadPool)
固定核心线程数,减轻设备负载

在ThreadPoolExecutor类中有几个非常重要的方法:

execute()
submit()
shutdown()
shutdownNow()

如果调用了shutdown()方法,则线程池处于SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕;

如果调用了shutdownNow()方法,则线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务;
  
submit()方法相比execute()会返回执行结果

线程池的作用

1 线程的重复创建和销毁很消耗系统的资源,线程池能够实现线程的重复利用,提高系统效率。

2 如果线程大量创建,很可能造成系统卡顿,各线程抢占CPU资源

3 线程池的未销毁线程,减免了创建线程的时间开销。提高了执行效率。

线程池的问题:

线程池中线程异常会补充线程操作

1 因为FixedThreadPool和 SingleThreadExecutor 底层用的阻塞队列是 LinkedBlockingQueue,这个队列是有界,但是最大值是 int 的最大值,21亿多,相当于无界。也就是说可能会在这里堆积大量的任务,造成OOM。CachedThreadPool本身线程数就可变,允许的最大线程数也是 int 的最大值,所以可能会创建大量的线程,最终造成OOM。

2 两个或两个以上的线程在执行过程中因争夺资源而产生相互等待的现象,造成死锁。

3 线程池的拒绝策略
AbortPolicy – 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
CallerRunsPolicy – 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。
DiscardOldestPolicy – 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
DiscardPolicy – 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。
参考:https://www.cnblogs.com/yaowen/p/9336961.html

自定义线程池:

corePoolSize:核心线程数量
maximumPoolSize:最大线程数量;
workQueue:等待队列,当任务提交时,如果线程池中的线程数量大于等于corePoolSize的时候,把该任务封装成一个Worker对象放入等待队列;
keepAliveTime:线程池维护线程所允许的空闲时间。当线程池中的线程数量大于corePoolSize的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了keepAliveTime;
TimeUnit :时间级别
threadFactory:它是ThreadFactory类型的变量,用来创建新线程。
handler:它是RejectedExecutionHandler类型的变量,表示线程池的饱和策略。如果阻塞队列满了并且没有空闲的线程,这时如果继续提交任务,就需要采取一种策略处理该任务。

当线程池中线程的数目大于核心线程数时,便将任务放入任务缓存队列里面,当任务缓存队列满了之后,便创建新的线程。

1、计算密集型:
一般设置CPU * 2即可

2、IO密集型
对于IO密集型的应用,我们可以多设置一些线程池中线程的数量,这样就能让在等待IO的这段时间内,线程可以去做其它事,提高并发处理效率

三种阻塞队列:
BlockingQueue workQueue = null;
workQueue = new ArrayBlockingQueue<>(5);//基于数组的先进先出队列,有界
workQueue = new LinkedBlockingQueue<>();//基于链表的先进先出队列,无界
workQueue = new SynchronousQueue<>();//无缓冲的等待队列,无界

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值