大家好,又见面了,我是你们的朋友全栈君。
线程池:4大方法,7大参数,4种拒绝策略
池化技术:把一些能够复用的东西(比如说数据库连接、线程)放到池中,避免重复创建、销毁的开销,从而极大提高性能。
优点:
线程池的创建不建议使用Executors(因为会发生内存溢出OOM),所以要通过ThreadPoolExecutors创建
newCachedThreadPool :创建一个可缓存的无界线程池,如果线程池长度超过处理需要,可灵活回收空线程,若无可回收,则新建线程。当线程池中的线程空闲时间超过60s,则会自动回收该线程,当任务超过线程池的线程数则创建新的线程,线程池的大小上限为Integer.MAX_VALUE,可看作无限大。
newFixedThreadPool:创建一个指定大小的线程池,可控制线程的最大并发数,超出的线程会在LinkedBlockingQueue阻塞队列中等待
newSingleThreadExecutor:创建一个单线程化的线程池,它只有一个线程,用仅有的一个线程来执行任务,保证所有的任务按照指定顺序(FIFO,LIFO,优先级)执行,所有的任务都保存在队列LinkedBlockingQueue中,等待唯一的单线程来执行任务。
newScheduledThreadPool:创建一个定长的线程池,可以指定线程池核心线程数,支持定时及周期性任务的执行
public class Test1 {
public static void main(String[] args) {
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); //无边界,根据情况自动创建线程池大小
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(5);//创建一个指定大小的线程池
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor(); //创建一个单线程化的线程池
for (int i = 0; i < 10; i++) {
newCachedThreadPool.execute(()->{
System.out.println(Thread.currentThread().getName());
});
}
System.out.println("============================");
for (int i = 0; i < 10; i++) {
newFixedThreadPool.execute(()->{
System.out.println(Thread.currentThread().getName());
});
}
System.out.println("============================");
for (int i = 0; i < 10; i++) {
newSingleThreadExecutor.execute(()->{
System.out.println(Thread.currentThread().getName());
});
}
// 关闭线程池
newCachedThreadPool.shutdown();
newFixedThreadPool.shutdown();
newSingleThreadExecutor.shutdown();
}
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
线程池底层ThreadPoolExecutor底层实现的步骤:
public class Test2 {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, //核心线程数
5,//最大线程数
3,//超时等待时间
TimeUnit.SECONDS,//超时等待的单位
new LinkedBlockingQueue<>(3),//阻塞队列
Executors.defaultThreadFactory(),//线程工厂 一般使用这个默认的
new ThreadPoolExecutor.AbortPolicy()//拒绝策略
);
//当队列满时就会触发最大线程数,让他创建线程,但是不会超过给定大小5个(说白了还能创建的就是3个)
for (int i = 0; i < 8; i++) {
executor.execute(()->{
System.out.println(Thread.currentThread().getName());
System.out.println("=================================");
});
}
}
}
它们分别是AbortPolicy
,CallerRunsPolicy
,DiscardOldestPolicy
和DiscardPolicy
AbortPolicy 终止策略,这是
ThreadPoolExecutor
线程池默认的拒绝策略,程序将会抛出RejectedExecutionException
异常。CallerRunsPolicy 调用者运行策略,线程池中没办法运行,那么就由提交任务的这个线程运行(哪儿来的回哪儿儿去~)。
DiscardOldestPolicy 丢弃最早未处理请求策略,丢弃最先进入阻塞队列的任务以腾出空间让新的任务入队列。
DiscardPolicy 丢弃策略,什么都不做,即丢弃新提交的任务。
System.out.println(Runtime.getRuntime().availableProcessors());
利用线程池提供的参数进行监控:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187000.html原文链接:https://javaforall.cn