고양이 댓글을 모니터링 스레드 풀을 모니터링 US 그룹

      일상의 프로젝트 개발에서, 우리는 종종, 서비스 로깅 서비스 모니터링 등으로 필요 비동기 처리 작업을 발생합니다. 보다 장점 "각 작업에 대한 스레드를 만들"는 "선교 스레드 풀은"기존의 스레드를 재사용하여, 스레드가 피할 만들 계속 때문에, 스레드 풀을 사용하여 생각됩니다 첫 번째 학생의 개발에 경험이 오버 헤드 중에 발생하는 파괴한다. 자바 개발에서 일반적인 관행이있는 ThreadPoolExecutor 클래스, 사용자 정의 corePoolSize를, maxPoolSize, ThreadFactory를하고 스레드 풀 유틸리티 클래스를 만들 수있는 다른 매개 변수를 기반으로합니다. 그러나, 스레드 풀은 단점이없는 것은 아니다, 개발자, 그것은 정확하게 온라인 프로젝트에 앞서 사업의 크기를 추정하기 어려운, 그래서 제대로 corePoolSize를 스레드 풀을 설정하는 방법, maxPoolSize는 이해하기 어려운 일이다 예상되는 성능을 달성, 심지어 온라인 실패로 이어질하지 불합리한으로 이어질 것입니다. 그러나, 우리가 제공 할 수있는 ThreadPoolExecutor 일부 모니터링 API를 사용, 우리는 스레드 풀 및 튜닝의 실시간 모니터링을 할 수 있습니다. 확장 기능과 함께 다음과 같은 몇 가지 API를 사용하는이 문서는 고양이를 제공하는 스레드 풀의 모니터링을 지속.

1. 사용자 정의 스레드 풀

다음 코드는 스레드 풀 유틸리티 클래스를 테스트하는 데 사용됩니다있다

public class ThreadPoolManager<T> {

    /**
     * 根据cpu的数量动态的配置核心线程数和最大线程数
     */
    //private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    /**
     * 核心线程数 = CPU核心数 + 1
     */
    private static final int CORE_POOL_SIZE = 20;
    /**
     * 线程池最大线程数 = CPU核心数 * 2 + 1
     */
    private static final int MAXIMUM_POOL_SIZE = 25;

    private static final int QUEUE_SIZE = 1000;

    /**
     * 非核心线程闲置时超时1s
     */
    private static final int KEEP_ALIVE = 3;


    /**
     * 线程池的对象
     */
    private final ThreadPoolExecutor executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE,
            KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue<>(QUEUE_SIZE),
            Executors.defaultThreadFactory(), new DiscardPolicyWithLog());

    /**
     * 要确保该类只有一个实例对象,避免产生过多对象消费资源,所以采用单例模式
     */
    private ThreadPoolManager() {
        
    }

    private static ThreadPoolManager sInstance;


    public static ThreadPoolManager getsInstance() {
        if (sInstance == null) {
            synchronized (ThreadPoolManager.class) {
                if (sInstance == null) {
                    sInstance = new ThreadPoolManager();
                }
            }
        }
        return sInstance;
    }

    /**
     * 开启一个无返回结果的线程
     * @param r
     */
    public void execute(Runnable r) {
        executor.execute(r);
    }

    /**
     * 开启一个有返回结果的线程
     *
     * @param r
     * @return
     */
    public Future<T> submit(Callable<T> r) {
        // 把一个任务丢到了线程池中
        return executor.submit(r);
    }

    /**
     * 把任务移除等待队列
     *
     * @param r
     */
    public void cancel(Runnable r) {
        if (r != null) {
            executor.getQueue().remove(r);
        }
    }
}

고양이 모니터링을 추가합니다

    당신의 고양이가 프로젝트 모니터링 통합되어 있다고 가정하면, 다음 SPI 고양이 확장 할 수있는 기능을 제공합니다 사용, 우리는 런타임 측정에 초점을 모든 시스템의 필요성을 모니터링 할 수 있습니다. 우리는 지금 어떤 지표, 우리가 더 나은 스레드 풀 구성을 최적화 할 수 있도록 시스템 성능을 향상시키기 위해, 런타임 스레드 풀을 모니터링 할. 도구 스레드 풀의 상기 구성 방법은 다음과 같은 코드를 첨가에서 달성 될 수있다.

private ThreadPoolManager() {
        StatusExtensionRegister.getInstance().register(new StatusExtension() {
            @Override
            public String getId() {
                return "mqtt_msg_pool_monitor";
            }

            @Override
            public String getDescription() {
                return "mqtt消息处理线程池监控";
            }

            @Override
            public Map<String, String> getProperties() {
                Map<String,String> map = new HashMap<>();
                //线程池曾经创建过的最大线程数量
                map.put("largest-pool-size", String.valueOf(executor.getLargestPoolSize()));
                map.put("max-pool-size", String.valueOf(executor.getMaximumPoolSize()));
                map.put("core-pool-size", String.valueOf(executor.getCorePoolSize()));
                map.put("current-pool-size", String.valueOf(executor.getPoolSize()));
                map.put("queue-size", String.valueOf(executor.getQueue().size()));

                return map;
            }
        });
    }

3. 효능

출시 사 원저 · 원 찬양 한 · 전망 3068

추천

출처blog.csdn.net/MrLee_123/article/details/104681236