首先问问大家是否了解线程呢?创建线程中有个方法是从线程池中创建,那么大家知道线程池有哪几种类呢?下面一起来了解一下吧!
一、线程池类型
线程池有哪几种类型呢,大家也了解ThreadPoolExecutor的用法吧,jdkExecutors包下还封装了一些其他类型的线程池。
1.newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads , 0 L, TimeUnit.MILLISECONDS , new LinkedBlockingQueue < Runnable > ()); }
从表面上可以知道,就是创建线程数量固定的线程池,线程池的corePoolSize参数和maximumPoolSize参数的大小是一样的,并且参数keepAliveTime的值为0,传入的队列LinkedBlockingQueue是为无界队列。学习ThreadPoolExecutor的时候我们也了解,传入一个无界队列,maximumPoolSize参数是不起作用的。
2.newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1 , 0 L, TimeUnit.MILLISECONDS , new LinkedBlockingQueue < Runnable > ())); }
从上述所描述的代码中我们可以知道的是,corePoolSize参数和maximumPoolSize参数都是1,keepAliveTime参数是0L, 传入的队列是无界队列。线程池中永远只要一个线程在工作。
3.newCachedThreadPool
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE , 60 L, TimeUnit.SECONDS , new SynchronousQueue < Runnable > ()); }
顾名思义,可缓存线程池,一说缓存一般离不开过期时间,该线程池也是,corePoolSize参数设置值为0,maximumPoolSize参数设置为int最大值,不同点是,线程池传入的队列是SynchronousQueue,一个同步队列,该队列没有任何容量,每次插入新数据,必须等待消费完成。当有新任务到达时,线程池没有线程则创建线程处理,处理完成后该线程缓存60秒,过期后回收,线程过期前有新任务到达时,则使用缓存的线程来处理。
4.newScheduledThreadPool
public static ScheduledExecutorService newScheduledThreadPool( int corePoolSize, ThreadFactory threadFactory) { return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory); }
这个线程池使用了ScheduledThreadPoolExecutor,该线程池继承自ThreadPoolExecutor, 执行任务的时候可以指定延迟多少时间执行,或者周期性执行。
以上就是今天所将的线程池的知识,如果想要了解更多java入门相关的知识,请继续关注本网站。
推荐文章: