线程池

概念


core       核心线程数        # 线程池内线程数量

max       最大线程数        # 线程池可同时执行的最大线程数 =线程池核心线程数+ 非线程池核心线程数。不可小于核心线程数

timeout  超时时间           #非线程池核心线程使用完后,等待销毁时间

queue    等待队列           #超过最大线程数阻塞队列数

java.lang.Runtime.availableProcessors()   #方法: 返回可用处理器的Java虚拟机的数量

线程池操作


基本操作

threadPool.execute(thread)  #传入线程,无返回值

threadPool.submit (thread)   #传入线程,有返回值  

threadPool.shutdown();     #销毁线程池 ,不接收新线程,线程池内已运行的线程j继续执行,销毁后的线程池无法在提交线程任务

threadPool.shutdownNow();    #同shutdown ,但触发线程中断标记Interrupted ,可在线程中判断中断代码,sleep、join、wait方法在中断标记中抛InterruptedException异常

threadPool.awaitTermination(1, TimeUnit.SECONDS));   #阻塞,直到线程池关闭所有任务执行完成,或发生超时,或当前线程中断 

查询

threadPool.isShutdown();     # 判断线程池是否已经关闭

threadPool.isTerminated();   # 判断任务全部执行完毕,并且线程池已经关闭,才会返回true

threadPool.getPoolSize()     #查询线程池中的线程数

移除线程池中排队任务

threadPool.remove(runnable);   #运行中的任务不能移除,submit()运行无法移除

设置允许核心线程超时销毁

threadPool.allowCoreThreadTimeOut(true)    #必须在任务提交前设置,ture允许,false不允许,不传查询

核心线程预启动

threadPool.prestartAllCoreThreads()   #启动全部核心线程,返回成功启动数量

threadPool.prestartCoreThread()   #启动一个核心线程,返回boolean 

线程池类型


CachedThreadPool(ThreadFactory)

传入线程可重复利用(缓存特性)。没有核心线程数,没有最大线程数限制,线程最大空闲时间60s,队列无数量。具有缓存性质的线程池,适合任务耗时短,数量大,线程可复用。

ExecutorService threadPool = Executors.newCachedThreadPool();   #60秒无线程任务会销毁

FixedThreadPool(ThreadFactory)

具有固定数量的线程池(一般cpu核数*20),核心线程数和最大线程数一致,线程最大空闲时间为0,执行完毕即销毁,超出最大线程数进行等待。高并发下控制性能

ExecutorService threadPool = Executors.newFixedThreadPool(8);   #不会销毁,手动shutdown

ScheduledThreadPool(ThreadFactory)

必须初始化核心线程数,底层使用DelayedWorkQueue实现延迟特性。具有时间调度特性的线程池

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);

scheduledThreadPool.schedule(runnable, 3, TimeUnit.SECONDS);   #指定时间后执行

scheduledThreadPool.scheduleAtFixedRate(task, 0, 2, TimeUnit.SECONDS);  #周期性时间调度

scheduledThreadPool.scheduleWithFixedDelay(task, 0, 2, TimeUnit.SECONDS);   #执行完后指定时间周期调度

scheduleWithFixedDelay.cancel(false);   #打断周期调度 ,true直接打断 ,false友好打断

SingleThreadExecutor(ThreadFactory)

核心线程数与最大线程数均为1,用于不需要并发的顺序执行。

自定义线程池


ThreadPoolExecutor executor = new ThreadPoolExecutor(3,7,60,TimeUnit.SECONDS,new LinkedBlockingQueue());#  核心线程数 ,  最大线程数 ,超时时间 ,队列   

超出策略   

AbortPolicy 超出队列的线程,抛异常

ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue(1),new AbortPolicy ());

CallerRunsPolicy 超出队列的线程,优先由主线程运行,线程池内线程等待主线程运行完毕后执行 

ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue(1),new CallerRunsPolicy ());

DiscardOldestPolicy 超出队列的线程时,丢弃最老的任务,替换超出的线程

ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue(1),new DiscardOldestPolicy ());

DiscardPolicy超出队列的线程时 ,直接丢弃,什么也不做

ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue(1),new DiscardPolicy ());

ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue(1),new MyPolicy());

RejectedExecutionHandler  重写方法,自定义超出策略

上免4类超出策略,都实现了RejectedExecutionHandler接口

ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue(1),new RejectedExecutionHandler(){ 

        @Override

        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { 

        System.out.println(r+"被拒绝执行"+System.currentTimeMillis()); }

});   

你可能感兴趣的:(线程池)