文档章节

自定义线程池

hensemlee
 hensemlee
发布于 01/19 13:43
字数 214
阅读 8
收藏 0

自定义线程工厂:

public class CustomThreadFactory implements ThreadFactory {

    private static final Logger LOGGER = LoggerFactory.getLogger(CustomThreadFactory.class);
    public static Thread.UncaughtExceptionHandler LOGGER_UNCAUGHT_EXCEPTION_HANDLER = (t, e) -> LOGGER.error(t.getName(), e);
    private static final AtomicInteger poolNumber = new AtomicInteger(1);
    private final ThreadGroup group;
    private final AtomicInteger threadNumber = new AtomicInteger(1);
    private final String namePrefix;

    private CustomThreadFactory(ThreadGroup group, String prefix) {
        if (group == null) {
            SecurityManager s = System.getSecurityManager();
            this.group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
        } else {
            this.group = group;
        }
        if (prefix == null) {
            this.namePrefix = "custom-" + poolNumber.getAndIncrement() + "-thread-";
        } else {
            this.namePrefix = prefix + "-pool_" + poolNumber.getAndIncrement() + "-thread-";
        }
    }

    public CustomThreadFactory(String prefix) {
        this(null, prefix);
    }

    @Override
    public Thread newThread(Runnable r) {

        // 线程组中活跃的线程数
//        this.group.activeCount();

        Thread t = new Thread(this.group, r, this.namePrefix + this.threadNumber.getAndIncrement(), 0);
        t.setDaemon(true);
        t.setUncaughtExceptionHandler(LOGGER_UNCAUGHT_EXCEPTION_HANDLER);
        if (t.getPriority() != Thread.NORM_PRIORITY) {
            t.setPriority(Thread.NORM_PRIORITY);
        }

        return t;
    }
}

单例模式自定义线程池:

public class MyAsyncExecutor extends ThreadPoolExecutor {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyAsyncExecutor.class);

    private MyAsyncExecutor() {
        super(Runtime.getRuntime().availableProcessors() * 5,
                500,
                1L,
                TimeUnit.MINUTES,
                new LinkedBlockingQueue<>(1000),
                new CustomThreadFactory("MyAsync"),
                (r, e) -> LOGGER.error("{}", e.getActiveCount()));
    }

    public static MyAsyncExecutor instance() {
        return Holder.INSTANCE;
    }

    private static class Holder {
        private static MyAsyncExecutor INSTANCE = new MyAsyncExecutor();
    }
}

© 著作权归作者所有

共有 人打赏支持
hensemlee
粉丝 8
博文 78
码字总数 52107
作品 0
徐汇
程序员
私信 提问
java 线程之executors线程池

一、线程池的作用   平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程。但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行...

xsster
2017/07/28
0
0
Android多线程操作——线程池管理综述

题记—— 难过了,悄悄走一走; 伤心了,默默睡一觉; 优雅不是训练出来的,而是一种阅历; 淡然不是伪装出来的,而是一种沉淀; 时间飞逝,老去的只是我们的容颜; 时间仿佛一颗灵魂,越来越...

赵子龙
2016/07/24
345
1
自定义线程池

如何自定义一个线程池,思路大概是这样的: 1,首先有一个池对象,该对象包含一个队列,这个队列用来放置请求线程的任务(这些任务是实现Runnable的类); 2,还有一个自定义线程池中的工作线...

蜡笔小小小新
2016/05/03
85
0
Java的四种线程池的使用,以及自定义线程工厂

四种线程池 四种线程池分别是:newCachedThreadPool、newFixedThreadPool 、newScheduledThreadPool 和newSingleThreadExecutor ,下面对这几个线程池一一讲解。 newCachedThreadPool:可缓存...

编辑之路
01/07
0
0
学习Java基础知识,打通面试关~十六自定义线程池

在上篇文章中我们了解到了Java是怎么来建立自带的线程池的,虽然Java中提供了多种线程池,但是我们还是在某些场景下需要实现自己的线程池操作。 新建立线程 在阿里的指导手册里面,也是建议自...

super糖
2018/07/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Typora快捷键

无序列表:输入-之后输入空格 有序列表:输入数字+“.”之后输入空格 任务列表:-[空格]空格 文字 标题:ctrl+数字 表格:ctrl+t 生成目录:[TOC]按回车 选中一整行:ctrl+l 选中单词:ctrl+...

AzureMonkey
48分钟前
2
0
SpringBoot2.x配置Cors跨域

1 跨域的理解 跨域是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务器的静态资源或请求。即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源。...

hengbao5
今天
2
0
mybatis(7) - 分页

一般程序在处理sql分页的场景,要么选择在程序中对所有的结果集sublist,要么在写sql时指定limit。那如何利用mybatis的特性在处理分页呢? 分页插件 适用于数据量大的情况下。 在真正执行sql...

noob_fly
今天
6
0
SpringBoot之使用jpa/hibernate

Springboot版本是2.1.3.RELEASE 1、依赖 List-1.1 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId></dependenc......

克虏伯
今天
6
0
安卓手机如何快速投屏到windows(10/8.1/7)电脑上

前提: 手机和电脑连接的网络必须在同一局域网下。 优势: 手机和电脑不需要下载对应平台的应用,完全使用全系统自带功能。 附加: 以下演示是安卓手机和windows操作系统电脑,并且win10和win10...

皇冠小丑
今天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部