说一说几种常见的线程池及适用场景有哪些?

线程池的作用还是很大的,方便管理 可以编写线程池管理代码对池中的线程同一进行管理,提高工作效率,那么下面我们就给大家分享一些几种常见的线程池及适用场景。

1、newFixedThreadPool(固定数目的线程池);

使用场景:

fixedThreadPool核心线程池等于最大线程池,当前的线程数能够比较稳定保证一个数。能够避免频繁回收线程和创建线程。故适用于处理cpu密集型的任务,确保cpu在长期被工作线程使用的情况下,尽可能少的分配线程,即适用长期的任务。

此方法的弊端是:

到了线程池最大容量后,如果有任务完成让出占用线程,那么此线程就会一直处于等待状态,而不会消亡,直到下一个任务再次占用该线程。这就可能会使用无界队列来存放排队任务,当大量任务超过线程池最大容量需要处理时,队列无线增大,使服务器资源迅速耗尽。

2、newCachedThreadPool(可缓存线程的线程池);

使用场景:

newCacehedThreadPool 的最大特点就是,线程数量不固定。只要有空闲线程空闲时间超过keepAliveTime,就会被回收。有新的任务,查看是否有线程处于空闲状态,如果不是就直接创建新的任务。故适用用于并发不固定的短期小任务。

此方法的弊端是:

线程池没有最大线程数量限制,如果大量的任务同时提交,可能导致创线程过多会而导致资源耗尽。

3、newSingleThreadExecutor(单线程的线程池);

使用场景:

newSingleThreadExecutor 适用串行化任务, 一个任务接着一个一个任务的执行。
public ScheduledThreadPoolExecutor(int corePoolSize)
{
    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS
        , new DelayedWorkQueue());
}

使用:

ScheduledThreadPoolExecutor scheduled = new ScheduledThreadPoolExecutor(2);
scheduled.scheduleAtFixedRate(new Runnable()
{
    @Override
    public void run()
    {
        loge("time:");
    }
}, 0, 40, TimeUnit.MILLISECONDS);
//0表示首次执行任务的延迟时间,40表示每次执行任务的间隔时间
//TimeUnit.MILLISECONDS执行的时间间隔数值单位

4、newScheduledThreadPool(定时及周期执行的线程池);

ScheduledThreadPoolExecutor 适用于定时操作一些任务。

这几种就是常见的线程池及适用场景,开发人员可以根据自己的开发需求去选择,提高开发效率!最后大家如果想要了解更多java面试题知识,敬请关注奇Q工具网。

推荐阅读:

jcreator怎么配置jdk?jcreator配置jdk教程

ReentrantLock与synchronized的区别有哪些?有相似点吗?

json数组怎么获取值?JQuery如何遍历json数组?