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

Java中如何从其他线程引用方法?跨线程调用方法求助

问题分析与解决方案

嘿,我一眼就看到你代码里的核心问题啦!首先会触发编译错误,还有潜在的线程安全隐患,我一步步给你梳理和修正:

1. 先解决最直接的编译错误:类型不匹配

你在help类的main方法里,把Thread对象传给了B的构造函数,但B的构造函数需要的是A类型的实例,不是Thread类型!得先单独创建A的实例,再用它去生成线程、传给B。修正后的代码如下:

class Help {
    public static void main(String[] args) {
        // 先创建A的实例,这才是我们要传给B的对象
        A aInstance = new A();
        Thread aThread = new Thread(aInstance);
        Thread bThread = new Thread(new B(aInstance));
        
        // 别忘了启动线程!不然run方法永远不会执行
        aThread.start();
        bThread.start();
    }
}

class A implements Runnable {
    // 建议去掉static:如果不是所有A实例共享这个值,static会带来线程安全风险
    private int tally;
    public void run() {
        // 这里可以添加A线程要执行的业务逻辑
    }
    public int getN() {
        tally = 6;
        return tally;
    }
}

class B implements Runnable {
    private A aref;
    public B(A ref){
        aref = ref;
    }
    public void run() {
        int result = aref.getN();
        // 可以打印结果验证调用是否成功
        System.out.println("从A线程的实例获取到的N值:" + result);
    }
}

2. 线程安全的重要提醒

  • 原代码里tally是static变量,这意味着所有A实例会共享这个值,如果多个线程同时操作它,很容易出现数据不一致的问题。如果每个A实例不需要共享这个值,直接去掉static就好。
  • 如果确实需要共享静态变量,建议给getN()方法加上synchronized关键字,或者使用AtomicInteger这类线程安全类,避免并发问题:
    public synchronized int getN() {
        tally = 6;
        return tally;
    }
    

新手常漏的小细节

一定要调用Thread.start()启动线程,直接调用run()方法只是普通的方法调用,不会开启新线程哦!

内容的提问来源于stack exchange,提问作者AYE I

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:28:01