Java循环检测CAD文件打开状态及跨类访问布尔值问题求助
我来帮你搞定这个问题,咱们一步步重构代码,实现循环检测CAD文件状态、支持跨类访问的需求:
核心问题分析
你当前的代码是单次检测,而且状态变量logical只在main方法里有效,没法被其他类访问。我们需要把检测逻辑封装成可复用的类,用成员变量保存状态,同时实现循环检测的逻辑。
重构后的完整代码
1. 封装检测逻辑的AutoCadCheck类
这个类负责CAD文件的状态检测、循环监控,并提供状态访问的接口:
import java.io.InputStream; import java.util.Scanner; public class AutoCadCheck { // 用更直观的命名:true表示CAD文件未打开,false表示已打开 private volatile boolean isCadFileClosed; // 目标CAD文件名称,可根据需求修改 private final String targetDwg = "123-4567.dwg"; // tasklist命令返回的"无匹配"提示文本 private final String noMatchMessage = "INFO: No tasks are running which match the specified criteria"; public AutoCadCheck() { // 初始化时先做一次检测 this.isCadFileClosed = checkCadStatus(); } // 单次检测CAD文件状态的私有方法 private boolean checkCadStatus() { // 补全命令末尾的双引号,避免语法错误 String command = String.format("tasklist /fi \"windowtitle eq Autodesk AutoCAD 2017 - [%s]\"", targetDwg); // 用try-with-resources自动关闭流,避免资源泄漏 try (InputStream inputStream = Runtime.getRuntime().exec(command).getInputStream(); Scanner scanner = new Scanner(inputStream)) { StringBuilder output = new StringBuilder(); while (scanner.hasNextLine()) { output.append(scanner.nextLine()).append(System.lineSeparator()); } return output.toString().contains(noMatchMessage); } catch (Exception e) { e.printStackTrace(); // 出现异常时默认认为文件未打开(可根据需求调整) return true; } } // 启动循环检测:放在独立线程中,避免阻塞主线程 public void startContinuousCheck() { new Thread(() -> { while (isCadFileClosed) { // 每隔2秒检测一次,可根据需求调整间隔 try { Thread.sleep(2000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } // 更新状态 isCadFileClosed = checkCadStatus(); // 可选:打印检测日志 if (isCadFileClosed) { System.out.println("DWG未打开,继续检测..."); } else { System.out.println("DWG已打开!"); } } }).start(); } // 给其他类提供状态访问的getter方法 public boolean isCadFileClosed() { return isCadFileClosed; } // 测试用的main入口 public static void main(String[] args) { AutoCadCheck cadChecker = new AutoCadCheck(); cadChecker.startContinuousCheck(); // 模拟另一个类的访问逻辑 AnotherClass anotherClass = new AnotherClass(cadChecker); anotherClass.startMonitoring(); } }
2. 访问状态的另一个类AnotherClass
这个类通过持有AutoCadCheck的实例,实时获取CAD文件状态:
public class AnotherClass { private final AutoCadCheck cadChecker; public AnotherClass(AutoCadCheck cadChecker) { this.cadChecker = cadChecker; } // 启动状态监控 public void startMonitoring() { new Thread(() -> { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } // 检测CAD是否已打开(即isCadFileClosed为false) if (!cadChecker.isCadFileClosed()) { System.out.println("AnotherClass检测到:DWG已打开!执行指定操作..."); // 这里写你需要执行的逻辑 break; // 执行完后退出循环,也可以根据需求持续监控 } } }).start(); } }
关键细节说明
volatile关键字:修饰isCadFileClosed,确保多线程下状态的可见性(检测线程和访问线程能实时同步状态)。- 资源自动管理:用
try-with-resources自动关闭输入流,比手动close更安全,避免资源泄漏。 - 线程隔离:循环检测和跨类监控都放在独立线程中,不会阻塞主线程,保证程序的响应性。
- 命名可读性:把模糊的
logical改成isCadFileClosed,让代码含义更清晰。
内容的提问来源于stack exchange,提问作者Moist Carrot
相关产品推荐
相关产品推荐

