如何创建线程池?

//使用Executors工具类
ExecutorService poll1 = Executors.newCachedThreadPool();//创建无上限线程池,默认上限是INTEGER.MAX
ExecutorService poll2 = Executors.newFixedThreadPool(3);//创建指定上限的线程池
​
//自定义创建
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(最多可传入七个参数);
//七参构造方法:
public ThreadPoolExecutor(int corePoolSize,//核心线程数
                              int maximumPoolSize,//最大线程数
                              long keepAliveTime,//空闲时间(值)
                              TimeUnit unit,//空闲时间(单位)使用TimeUnit指定,如秒:TimeUnit.SECONDS
                              BlockingQueue<Runnable> workQueue,//阻塞队列,决定排队线程队列的长度,想要指定长度时:使用new ArrayBlockingQueue<>(3),如果不想指定多长可以用new LinkedBlockingQueue<>()
                              ThreadFactory threadFactory,//创建线程的方式可以使用Executors.defaultThreadFactory()创建进行,源码中只不过是创建了一个Thread,但是进行了一系列的设置。
                              RejectedExecutionHandler handler)//任务拒绝策列{}
//创建示例:
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3,
                                                               6,
                                                               60,
                                                               TimeUnit.SECONDS,
                                                               new LinkedBlockingQueue<>(),
                                                               Executors.defaultThreadFactory(),
                                                               new ThreadPoolExecutor.AbortPolicy());、
//调用submit()方法可以提交任务:
threadPoolExecutor.submit(实现Runnable或Callable的任务)
    
//线程池默认不会关闭,需调用shutdown方法:
threadPoolExecutor.shutdown();

自定义线程的七大核心参数

自定义线程的几种情况:

情况一:

此时核心线程是3,最大线程是6,提交3个任务,此时线程池会创建三个线程,分别执行三个任务,不会创建临时线程。

情况2:

此时核心线程是3,最大线程是6,提交5个任务,此时线程池会创建三个线程去执行三个任务,剩下两个任务进行队列排队等待,不会创建临时线程。

情况3:

        此时核心线程是3,最大线程是6,队伍长度为3,提交8个任务,此时会先创建三个线程执行三个任务,并让接下来三个任务进行等待队伍,剩下了2个任务。因为此时核心线程在忙,等待队伍已满,所以此时会创建临时队列,线程4与线程5来执行任务7与任务8。

情况4:

        此时核心线程是3,最大线程是6,队伍长度为3,提交10个任务,此时会先创建三个线程执行三个任务,并让接下来三个任务进行等待队伍,剩下了3个任务。因为此时核心线程在忙,等待队伍已满,所以此时会创建3个临时队列,线程4、线程5和线程6来执行任务7、任务8和任务9.此时会剩下一个任务10,因为此时核心线程在忙,等待队伍已满,临时线程已经全部占用,就会触发任务拒绝策略。

针对任务拒绝策列有四种,默认是第一种(AbortPolicy)。

根据以上情况,此时剩下任务10未执行,四种策列执行情况如下:

AbortPolicy:将任务10丢弃,并抛出异常。

DiscardPolicy:将任务10丢弃,但是不抛异常。

DiscardOldestPolicy:将等待最久的抛弃,即丢弃等待队列的队首(任务4).

CallerRunsPolicy:不创建线程,直接在创建线程池的当前线程调用run()方法把任务给执行了。

自定义线程池多大合适?

最大并行数

通过代码可以调用当前系统Java可利用的最大并行数:

System.out.println(Runtime.getRuntime().availableProcessors());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值