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
相关产品推荐
相关产品推荐

