You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:10:09