日常のプロジェクトの開発では、私たちはしばしば、サービスを監視し、そのようなロギングサービスとして必要非同期処理タスクを、遭遇しそうに。利点「タスクごとにスレッドを作成」「でミッション・スレッド・プール」は、既存のスレッドを再利用することにより、スレッドは避け作成するために続けているので、私は、スレッドプールを使用して考えるだろう最初の学生の開発にいくつかの経験を持っていますオーバーヘッドの間に生成破壊します。Java開発では、一般的には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);
}
}
}
2. [追加]猫の監視
あなたの猫は、プロジェクトの監視統合されていると仮定すると、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;
}
});
}