JAVA线程池执行任务,单开一个监测服务器内存使用的线程
时间: 2024-10-16 14:19:05 浏览: 39
在Java中,我们可以使用`Executors`或者`ThreadPoolExecutor`来创建线程池,并利用它来执行异步任务。同时,为了监控服务器内存使用情况,我们可以结合`MemoryMXBean`接口,这个接口提供了获取Java虚拟机内存信息的方法。下面是一个简单的示例,展示如何创建一个固定大小的线程池并开启一个单独的监视线程:
```java
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MemoryMonitoringThreadPool {
private static final int THREAD_POOL_SIZE = 5;
public static void main(String[] args) {
// 创建线程池
ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
// 开启一个独立的线程用于监控内存
Thread memoryMonitor = new Thread(() -> monitorMemory()) {
@Override
public void run() {
try {
while (true) {
measureAndLogMemoryUsage();
// 可以在这里设置睡眠时间和检查频率,例如每秒检查一次
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
memoryMonitor.start();
// 线程池执行任务
for (int i = 0; i < 10; i++) {
threadPool.submit(new RunnableTask());
}
// 关闭线程池后,等待所有任务完成
threadPool.shutdown();
}
private static void measureAndLogMemoryUsage() {
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
double heapMemoryUsed = memoryBean.getHeapMemoryUsage().getUsed(); // 获取堆内存已使用量
double nonHeapMemoryUsed = memoryBean.getNonHeapMemoryUsage().getUsed(); // 获取非堆内存已使用量
System.out.println("Memory Usage (MB): Heap = " + heapMemoryUsed / (1024 * 1024) + ", Non-Heap = " + nonHeapMemoryUsed / (1024 * 1024));
}
static class RunnableTask implements Runnable {
@Override
public void run() {
// 这里只是一个示例任务,实际任务替换为你的业务代码
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
在这个例子中,`RunnableTask`是线程池将执行的任务,而`monitorMemory()`方法负责持续监控内存并打印相关信息。当主线程关闭线程池时,`memoryMonitor`线程会继续运行直到手动停止。
**相关问题**:
1. Java的线程池有哪些类型?
2. 如何设置线程池的线程优先级?
3. `MemoryMXBean`能提供哪些关于内存的信息?
阅读全文
相关推荐













