如何编写Demo1.java以检测Demo2.java是否正在运行?
如何编写Demo1.java检测运行中的Demo2线程?
首先先确认你提供的Demo2.java代码(已格式化):
public class Demo2 extends Thread { public void run() { while(true) { System.out.println("Demo2 is running"); } } }
根据你的三个需求(运行Demo2、启动Demo1、Demo1检测Demo2状态),这里提供两种实用的实现方案:
方案一:持有Demo2线程实例直接检测(推荐)
这种方式最直接高效,Demo1通过持有Demo2的Thread对象引用,调用线程的isAlive()方法判断其是否处于活动状态。
public class Demo1 { private final Thread demo2Thread; // 通过构造器传入Demo2线程实例 public Demo1(Thread demo2Thread) { this.demo2Thread = demo2Thread; } // 核心检测逻辑:定时检查Demo2状态 public void startMonitoring() { while (true) { if (demo2Thread.isAlive()) { System.out.println("Demo1检测:Demo2正在运行"); } else { System.out.println("Demo1检测:Demo2已停止运行"); break; // 检测到停止后退出循环 } try { // 每隔1秒检测一次,避免频繁占用资源 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); break; } } } public static void main(String[] args) { // 1. 启动Demo2线程 Thread demo2 = new Demo2(); demo2.start(); // 2. 初始化Demo1并启动检测(放在单独线程,避免阻塞主线程) Demo1 demo1 = new Demo1(demo2); new Thread(demo1::startMonitoring).start(); } }
方案说明:
isAlive()方法会返回true当且仅当线程已经调用start()启动,且尚未正常终止或被中断。- 把Demo1的检测逻辑放在独立线程中,避免阻塞主线程的执行。
- 加入1秒的休眠,防止检测逻辑过度占用CPU资源。
方案二:通过线程名称查找检测(无需持有实例)
如果你的场景中无法直接获取Demo2的线程实例,可以给Demo2设置唯一线程名,然后遍历JVM中的所有线程来查找检测:
public class Demo1 { // 目标线程名称,和Demo2的线程名对应 private static final String TARGET_THREAD_NAME = "Demo2-Worker"; public void startMonitoringByName() { while (true) { boolean isDemo2Running = false; // 遍历JVM中所有活跃线程 for (Thread thread : Thread.getAllStackTraces().keySet()) { if (TARGET_THREAD_NAME.equals(thread.getName()) && thread.isAlive()) { isDemo2Running = true; break; } } System.out.println(isDemo2Running ? "Demo1检测:Demo2正在运行" : "Demo1检测:Demo2已停止运行"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); break; } } } public static void main(String[] args) { // 1. 启动Demo2并设置线程名 Thread demo2 = new Demo2(); demo2.setName(TARGET_THREAD_NAME); demo2.start(); // 2. 启动Demo1的检测逻辑 Demo1 demo1 = new Demo1(); new Thread(demo1::startMonitoringByName).start(); } }
方案说明:
Thread.getAllStackTraces().keySet()会返回当前JVM中所有的线程对象。- 这种方式无需持有Demo2的实例,但遍历线程的开销比方案一大,适合无法获取实例的场景。
内容的提问来源于stack exchange,提问作者Abhishek Roy
相关产品推荐
相关产品推荐

