面试题答案
一键面试设计思路
- 资源监控:使用Java的
ManagementFactory
来获取内存、网络等资源的使用情况。例如,通过MemoryMXBean
获取内存信息,通过NetworkInterface
获取网络接口统计信息。 - 动态调整线程池大小:根据资源监控情况,动态调整可缓存线程池(
CachedThreadPool
)的大小。当其他资源紧张时,适当减少线程池的活跃线程数;当资源充足时,增加线程池的活跃线程数。 - 资源隔离:为不同类型的任务分配不同的线程池,避免某一类任务过度占用资源影响其他任务。
技术方案
- 资源监控实现:
import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.net.NetworkInterface; import java.util.Enumeration; public class ResourceMonitor { public static long getFreeMemory() { MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); return memoryMXBean.getHeapMemoryUsage().getMax() - memoryMXBean.getHeapMemoryUsage().getUsed(); } public static long getNetworkTxBytes() { try { Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); long totalTxBytes = 0; while (networkInterfaces.hasMoreElements()) { NetworkInterface networkInterface = networkInterfaces.nextElement(); totalTxBytes += networkInterface.getTransmittedBytes(); } return totalTxBytes; } catch (Exception e) { e.printStackTrace(); return 0; } } }
- 动态调整线程池大小:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; public class ThreadPoolManager { private static final ExecutorService executorService = Executors.newCachedThreadPool(); private static final int MAX_THREADS = 100; private static final int MIN_THREADS = 10; public static void adjustThreadPoolSize() { long freeMemory = ResourceMonitor.getFreeMemory(); long networkTxBytes = ResourceMonitor.getNetworkTxBytes(); ThreadPoolExecutor executor = (ThreadPoolExecutor) executorService; int currentPoolSize = executor.getPoolSize(); if (freeMemory < 1024 * 1024 * 100 && currentPoolSize > MIN_THREADS) { executor.setCorePoolSize(currentPoolSize - 1); executor.setMaximumPoolSize(currentPoolSize - 1); } else if (networkTxBytes > 1024 * 1024 * 100 && currentPoolSize < MAX_THREADS) { executor.setCorePoolSize(currentPoolSize + 1); executor.setMaximumPoolSize(currentPoolSize + 1); } } }
- 任务提交与资源管理:
public class TaskSubmitter { public static void main(String[] args) { for (int i = 0; i < 100; i++) { ThreadPoolManager.adjustThreadPoolSize(); ThreadPoolManager.executorService.submit(() -> { // 任务逻辑 System.out.println("Task is running."); }); } ThreadPoolManager.executorService.shutdown(); } }
总结
通过上述方案,实现了对内存、网络等资源的监控,并根据资源使用情况动态调整可缓存线程池的大小,从而有效协同系统整体资源,确保系统性能的稳定与高效。同时,可根据实际业务场景进一步优化资源监控指标和线程池调整策略。