Skip to content

身份认证怎么做的?

当时我们做团长申请审核的时候,需要做身份认证,我做身份认证的时候,身份认证需要如下几个步骤,身份证对比认证,活体对比认证,文件上传,他们都是调用第三方接口完成,比较耗时,同步去做需要3到4秒,这个经过我的优化,用多线程,线程池,通过3个任务,实现callable接口,返回Future获取值,然后合并处理,只需要不到1到1.5秒了

你怎么知道哪些线程有没有执行完才返回?

我们用的jdk1.8有一个CompletableFuture它里面有个join方法可以等所有线程执行完后,我们通过get方法可以获取到线程结果再处理

那你们用线程池的大小设置的多大呢?为什么要这么设置

线程池的大小设置,一般都是CPU核数+1,这样线程数就等于CPU核数.我们这个任务执行的稍微有点慢,然后调用的是第三方的接口,属于IO密集度,所以核心线程数和最大线程数设置的稍微大了点,核心线程数是3*cpu核数,最大线程数在原来的核心线程数上加了20到30之间

线程池的七个参数

线程池的七个参数,分别表示核心线程数,最大线程数,闲置时间,任务队列,线程工厂,拒绝策略,是否允许核心线程超时

  • corePoolSize:核心线程数,默认情况下核心线程会一直存活,即使没有任务需要执行,线程池也会一直保持,除非设置allowCoreThreadTimeOut属性为true,设置allowCoreThreadTimeOut为true后,核心线程会超时,超过keepAliveTime设置的时间后,核心线程会关闭
  • maximumPoolSize:最大线程数,当核心线程数达到最大线程数时,会创建非核心线程,非核心线程会根据keepAliveTime来设置超时时间,超过keepAliveTime设置的时间后,非核心线程会关闭
  • keepAliveTime:非核心线程的闲置时间,超过keepAliveTime设置的时间后,非核心线程会关闭
  • workQueue:任务队列,任务队列用于存放等待执行的任务,任务队列的容量大小,默认情况下容量大小为Integer.MAX_VALUE,如果任务队列的容量大小为非Integer.MAX_VALUE,那么当任务队列的容量达到最大值时,线程池会创建非核心线程,如果任务队列的容量为Integer.MAX_VALUE,那么线程池会创建非核心线程,直到最大线程数达到,然后任务会被拒绝
  • threadFactory:线程工厂,用于创建线程,默认情况下使用Executors.defaultThreadFactory()创建线程,线程工厂可以自定义线程名称,线程优先级,线程组等
  • rejectedExecutionHandler:拒绝策略,当任务队列的容量达到最大值时,线程池会创建非核心线程,如果任务队列的容量为Integer.MAX_VALUE,那么线程池会创建非核心线程,直到最大线程数达到,然后任务会被拒绝,拒绝策略可以自定义拒绝策略,比如忽略拒绝任务,抛出异常,或者执行拒绝任务
  • allowCoreThreadTimeOut:是否允许核心线程超时,默认情况下核心线程会一直存活,即使没有任务需要执行,线程池也会一直保持,除非设置allowCoreThreadTimeOut属性为true,设置allowCoreThreadTimeOut为true后,核心线程会超时,超过keepAliveTime设置的时间后,核心线程会关闭