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