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

Java咨询:如何从运行中的其他类获取实时更新的变量

解决方案:Java中跨类实时获取更新变量值

核心问题分析

你当前的代码里,Class_one和Class_two各自有独立的main方法,运行时会启动两个独立的JVM进程。静态变量a仅在单个进程内共享,不同进程的内存空间完全隔离,所以Class_one根本拿不到Class_two进程里更新的a值——这是代码无效的根本原因。

如果你的实际场景是同一个程序内的文件复制+进度展示,应该用多线程实现,让复制逻辑和进度监控在同一个JVM进程里运行。

推荐解决方案:同一进程内多线程实现

1. 修复线程可见性问题

静态变量需要用volatile修饰,确保一个线程更新后,其他线程能立刻看到最新值(避免JVM缓存优化导致的可见性问题)。

2. 重构代码,多线程运行复制逻辑

把复制逻辑放到线程中执行,主线程负责实时读取进度变量。重构后的完整代码:

public class ProgressMonitor {
    public static void main(String[] args) throws InterruptedException {
        FileCopier copier = new FileCopier();
        // 启动复制线程
        new Thread(copier::startCopy).start();
        
        // 主线程实时监控进度
        while (true) {
            long copiedBytes = copier.getCopiedBytes();
            System.out.println("当前已复制:" + copiedBytes);
            Thread.sleep(1000); // 每秒查询一次,避免频繁占用CPU
        }
    }
}

class FileCopier {
    // volatile保证线程间可见性
    private volatile long copiedBytes;

    public void startCopy() throws InterruptedException {
        // 模拟文件分块复制逻辑,替换为实际IO操作即可
        for (long b = 0; b < 100; b++) {
            Thread.sleep(1000); // 模拟每次复制耗时1秒
            copiedBytes = b;
            System.out.println("复制中:" + copiedBytes);
        }
    }

    public long getCopiedBytes() {
        return copiedBytes;
    }
}

3. 进阶:更安全的线程安全方案

如果变量会被多个线程同时修改(比如多线程并行复制),建议用AtomicLong代替volatile long,它能保证原子性操作,避免并发修改问题:

import java.util.concurrent.atomic.AtomicLong;

class FileCopier {
    private AtomicLong copiedBytes = new AtomicLong(0);

    public void startCopy() throws InterruptedException {
        for (long b = 0; b < 100; b++) {
            Thread.sleep(1000);
            copiedBytes.set(b);
            System.out.println("复制中:" + copiedBytes.get());
        }
    }

    public long getCopiedBytes() {
        return copiedBytes.get();
    }
}

特殊场景:不同进程间的进度同步

如果确实需要两个独立程序(比如后台复制程序+前台进度查看程序),可以用以下方式实现进程间通信:

  • 临时文件:复制程序定期将进度写入文本文件,查看程序读取该文件
  • Socket通信:建立TCP/UDP连接,复制程序主动推送进度给查看程序
  • 内存映射文件:用FileChannel实现共享内存区域

但这种方式复杂度较高,新手优先推荐同一进程内的多线程方案。

内容的提问来源于stack exchange,提问作者Fanie Du Plessis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:30:47