From 2d31c2aa34ee1e46519d82159470a7ee98b94797 Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Mon, 23 Feb 2026 21:12:49 +0800 Subject: [PATCH] perf[command]: add thread pool to process command --- .../java/com/zfoo/monitor/util/OSUtils.java | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/monitor/src/main/java/com/zfoo/monitor/util/OSUtils.java b/monitor/src/main/java/com/zfoo/monitor/util/OSUtils.java index 1512daa8..242db05b 100644 --- a/monitor/src/main/java/com/zfoo/monitor/util/OSUtils.java +++ b/monitor/src/main/java/com/zfoo/monitor/util/OSUtils.java @@ -15,8 +15,10 @@ package com.zfoo.monitor.util; import com.zfoo.monitor.*; import com.zfoo.net.util.NetUtils; -import com.zfoo.protocol.exception.RunException; -import com.zfoo.protocol.util.*; +import com.zfoo.protocol.util.FileUtils; +import com.zfoo.protocol.util.IOUtils; +import com.zfoo.protocol.util.StringUtils; +import com.zfoo.protocol.util.ThreadUtils; import com.zfoo.scheduler.util.TimeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,12 +29,15 @@ import oshi.software.os.OperatingSystem; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.text.NumberFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; /** * Oshi库封装的工具类,通过此工具类,可获取系统、硬件相关信息 @@ -254,6 +259,15 @@ public abstract class OSUtils { } // ----------------------------------------------------------------------------------------------------------------- + private static final ExecutorService executors = Executors.newCachedThreadPool(new MonitorThreadFactory()); + public static class MonitorThreadFactory implements ThreadFactory { + private final AtomicInteger threadNumber = new AtomicInteger(1); + @Override + public Thread newThread(Runnable runnable) { + var threadName = StringUtils.format("monitor-t-{}", threadNumber.getAndIncrement()); + return new Thread( runnable, threadName); + } + } public static String execCommand(String command) { logger.info("execCommand [{}]", command); try { @@ -286,23 +300,21 @@ public abstract class OSUtils { var err = new StringBuilder(); // 异步读取输出,避免缓冲区阻塞 - var outThread = new Thread(ThreadUtils.safeRunnable(() -> { + executors.submit(ThreadUtils.safeRunnable(() -> { try { out.append(StringUtils.bytesToString(IOUtils.toByteArray(process.getInputStream()))); } catch (IOException e) { throw new RuntimeException(e); } })); - var errThread = new Thread(() -> { + executors.submit(ThreadUtils.safeRunnable(() -> { try { err.append(StringUtils.bytesToString(IOUtils.toByteArray(process.getErrorStream()))); } catch (IOException e) { throw new RuntimeException(e); } - }); - outThread.start(); - errThread.start(); + })); var finished = process.waitFor(256, TimeUnit.SECONDS); if (!finished) { @@ -312,9 +324,6 @@ public abstract class OSUtils { process.destroy(); - outThread.join(); - errThread.join(); - // 获取线程的退出值,0代表正常退出,非0代表异常中止 int exitValue = process.exitValue(); if (exitValue != 0) {