线程池

线程池作用就是限制系统中执行线程的数量。根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。

在java中线程池一般使用ThreadPoolExecutor来创建

threadTest = new ThreadPoolExecutor(int corePoolSize, 
                              int maximumPoolSize,  
                              long keepAliveTime,  
                              TimeUnit unit,  
                              BlockingQueue<Runnable> workQueue, 
                              ThreadFactory threadFactory)
              

参数:

参数名 参数作用
核心线程数corePoolSize 保持在池中的线程数
最大线程数maximumPoolSize 最多创建线程数量,当超过该设置参数的线程数时,抛出异常
保活时间keepAliveTime 线程数大于corePoolSize,闲置线程最大空闲时间
时间单位unit TimeUnit是一个枚举类型,翻译过来就是时间单位,我们最常用的时间单位包括:
MILLISECONDS 1毫秒 、SECONDS : 秒、MINUTES : 分、HOURS : 小时、DAYS : 天
阻塞队列workQueue 该线程池中的任务队列:维护着等待执行的Runnable对象。当所有的核心线程都在干活时,新添加的任务会被添加到这个队列中等待处理,如果队列满了,则新建非核心线程执行任务

执行线程池任务

threadTest.execute(new Runnable(){
    @Override
    public void run(){
       //logHelper.w("create thread");
    }    
});

创建线程时,当创建线程数未达到corePoolsize,则会系统会自动新建一些线程,保持线程数量与corePoolsize上参数的数量相等。
创建线程数超过maximumPoolSize,抛出异常

其他两种线程池

线程池方面,JDK 为我们内置了其他两种线程池:

  • newFixedThreadPool:newFixedThreadPool,创建固定大小的线程池,poolCoreSize和maxPoolSize 相等,到达coreSize,则将新的任务放到缓存队列,有线程执行完毕,直接去取。

  • newCacheThreadPool:newCacheThreadPool,无大小限制的线程池,提交一个任务就创建一个线程执行。

如果默认的几种线程池还不能满足你的需求,那就试一试自定义线程池

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容