通过Executor创建线程池
Executor.newFixedTreadPool
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
内部通过new ThreadPoolExecutor创建线程池
返回一个固定数量的线程池。如果线程池中有空闲线程则直接交给空闲线程执行。如果没有将任务放到队列
Executor.newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }
返回一个线程的线程池,如有空闲则执行,没有则将任务放到队列中等待
Executor.newCachedTreadPool
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
返回一个根据实际情况调整线程个数的线程池塘 不限制最大线程数,如果有空闲线程则直接交给空线程执行 没有则创建,线程空闲超过60秒则指定回收
Exucutor.newScheduledThreadPool
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); }
public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); }
public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService
可以发现还是通过ThreaPoolExecutor实现 队列使用DeayedWorkQueue
返回SchededExecutoryService对象
可以实现定时任务
public static void main(String[] args) throws InterruptedException { ScheduledExecutorService scheduledExecutorService= Executors.newScheduledThreadPool(1); scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("11"); } },1,3,TimeUnit.SECONDS); // 1为延迟多久执行 3为轮训时间 TimeUnit.seconds为 时间单位 }
自定义线程池
ThreadPoolExecutor的构造函数
public ThreadPoolExecutor(int corePoolSize,//核心线程数量 (默认线程数量) int maximumPoolSize,//最大线程数量(如果没有超过最大线程数量 没有空闲线程则创建) long keepAliveTime,//线程的生命周期 TimeUnit unit,//keepAliveTime时间单位 BlockingQueue<Runnable> workQueue,//若没有空闲线程 任务放置的队列 ThreadFactory threadFactory, RejectedExecutionHandler handler)//队列有有界队列。如果任务队列满了以后。拒绝的任务的自定义操作