Executors--线程池三大方法,七大参数,4大拒绝策略

Executors--线程池三大方法,七大参数,4大拒绝策略

七大参数
ExecutorService threadPool = new ThreadPoolExecutor(
2,//默认核心线程数
5,//最大线程数
3,//实际线程量小于默认+阻塞,多久就恢复释放最大线程到默认线程
TimeUnit.SECONDS,//时间单位
new ArrayBlockingQueue<>(3),//阻塞队列
Executors.defaultThreadFactory(),//默认的线程工厂
new ThreadPoolExecutor.AbortPolicy()//拒绝策略
);

四大拒绝策略
new ThreadPoolExecutor.AbortPolicy() //银行满了,还有人进来,不处理这个人,抛出异常
new ThreadPoolExecutor.CallerRunsPolicy()//哪里来的去那里
new ThreadPoolExecutor.DiscardPolicy()//队列满了,丢掉任务,不抛异常
new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了,尝试和第一个竞争,不抛异常

如何定义最大线程
1,CPU密集型: 几核就是几,保持CPU效率最高 Runtime.getRuntime().availableProcessors()
2,IO密集型: 大于你程序中十分耗IO的线程、程序。

package ExecutorsA;

import java.util.concurrent.*;

/**
 * Executors 工具三大方法
 * 七大参数     ExecutorService threadPool = new ThreadPoolExecutor(
 *                 2,//默认核心线程数
 *                 5,//最大线程数
 *                 3,//实际线程量小于默认+阻塞,多久就恢复释放最大线程到默认线程
 *                 TimeUnit.SECONDS,//时间单位
 *                 new ArrayBlockingQueue<>(3),//阻塞队列
 *                 Executors.defaultThreadFactory(),//默认的线程工厂
 *                 new ThreadPoolExecutor.AbortPolicy()//拒绝策略
 *               );
 * 四大拒绝策略  new ThreadPoolExecutor.AbortPolicy() //银行满了,还有人进来,不处理这个人,抛出异常
 *             new ThreadPoolExecutor.CallerRunsPolicy()//哪里来的去那里
 *             new ThreadPoolExecutor.DiscardPolicy()//队列满了,丢掉任务,不抛异常
 *             new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了,尝试和第一个竞争,不抛异常
 * @author liu
 */
public class ThreadPoolA {
    public static void main(String[] args) {
        //executor三大方法,不常用
        //ExecutorService threadPool = Executors.newSingleThreadExecutor();//单个线程
        //ExecutorService threadPool = Executors.newFixedThreadPool(5);//创建一个固定大小的线程池
        //ExecutorService threadPool = Executors.newCachedThreadPool();//可伸缩的,遇强则强,遇弱则弱

        //自定义线程池,常用
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                Runtime.getRuntime().availableProcessors(),
                3,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()
        );
        try {
            for (int i = 0; i < 9; i++) {
                //使用线程池之后,用线程池来创建线程
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + " OK");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {//线程池用完,程序结束,关闭线程池
            threadPool.shutdown();
        }
    }
}

posted @   小幼虫虫  阅读(244)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示