如果存在同名的进程,有的是活动的而有的是非活动的,你可以修改代码以仅关闭非活动的进程。以下是一个相应的示例:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class AutoCloseInactiveProcesses {
public static void main(String[] args) {
String processName = "your_program.exe"; // 替换成你要检测和关闭的程序的进程名或完整路径
// 创建并启动自动关闭线程
AutoCloseThread autoCloseThread = new AutoCloseThread(processName);
Thread thread = new Thread(autoCloseThread);
thread.start();
}
}
class AutoCloseThread implements Runnable {
private String processName;
public AutoCloseThread(String processName) {
this.processName = processName;
}
@Override
public void run() {
while (true) {
try {
// 获取所有同名的进程ID
int[] processIds = getProcessIds(processName);
if (processIds.length > 0) {
for (int processId : processIds) {
// 检测进程是否活动
boolean isActive = isProcessActive(processId);
if (!isActive) {
System.out.println("进程 " + processId + " 未响应或未处于活动状态。尝试关闭进程。");
// 执行关闭进程的操作
closeProcess(processId);
System.out.println("进程 " + processId + " 关闭尝试完成。");
}
}
}
// 等待一段时间再进行下一次检测
Thread.sleep(5000); // 5秒钟
} catch (InterruptedException | IOException e) {
e.printStackTrace();
}
}
}
private int[] getProcessIds(String processName) throws IOException {
// 使用ProcessBuilder执行任务列表命令
ProcessBuilder processBuilder = new ProcessBuilder("tasklist", "/FI", "IMAGENAME eq " + processName);
Process process = processBuilder.start();
// 读取命令输出
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
String line;
StringBuilder output = new StringBuilder();
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
}
// 从输出中解析进程ID
return parseProcessIds(output.toString());
}
}
private int[] parseProcessIds(String tasklistOutput) {
String[] lines = tasklistOutput.split("\n");
int[] processIds = new int[lines.length - 3]; // 减去前三行非进程信息
for (int i = 3; i < lines.length; i++) {
String[] parts = lines[i].trim().split("\\s+");
processIds[i - 3] = Integer.parseInt(parts[1]);
}
return processIds;
}
private boolean isProcessActive(int processId) throws IOException {
// 使用ProcessBuilder执行任务列表命令
ProcessBuilder processBuilder = new ProcessBuilder("tasklist", "/FI", "PID eq " + processId);
Process process = processBuilder.start();
// 读取命令输出
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
// 检查输出中是否包含进程ID
if (line.contains(String.valueOf(processId))) {
return true;
}
}
}
return false;
}
private void closeProcess(int processId) throws IOException {
// 使用ProcessBuilder执行关闭进程的命令
ProcessBuilder processBuilder = new ProcessBuilder("taskkill", "/F", "/PID", String.valueOf(processId));
processBuilder.start();
}
}
```
在这个例子中,`getProcessIds`方法获取所有同名进程的ID,然后遍历每个进程,检测它是否活动,如果不是,则尝试关闭它。请注意,这仍然依赖于`tasklist`和`taskkill`命令,因此可能需要根据操作系统和具体情况进行调整。