我是Thread的新手.我创建了两个名为A和B的类,如下所示 -
public class A {
private B b;
public void setB(B b) {
this.b = b;
}
synchronized void foo() {
b.foo();
System.out.println("Hi A");
}
}
public class B {
private A a;
public void setA(A a) {
this.a = a;
}
synchronized void foo() {
a.foo();
System.out.println("Hi B");
}
}
Run Code Online (Sandbox Code Playgroud)
现在我创建了另外两个实现Runnable接口的类.
public class AThread implements Runnable{
private A a;
public AThread(A a){
this.a = a;
}
@Override
public void run() {
a.foo();
}
}
public class BThread implements Runnable {
private B b;
public BThread(B a){
this.b = b;
}
@Override
public void run() {
b.foo();
}
}
Run Code Online (Sandbox Code Playgroud)
在主要方法中,我写了以下代码 -
public static void main(String args[]) {
A a = new A();
B b = new B();
a.setB(b);
b.setA(a);
Runnable r1 = new AThread(a);
Runnable r2 = new BThread(b);
Thread t1 = new Thread(r1);
t1.start();
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我得到以下异常.
Exception in thread "Thread-0" java.lang.StackOverflowError
at student.B.foo(B.java:21)
at student.A.foo(A.java:21)..
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释它的原因是什么,我该如何解决?
Era*_*ran 11
你有什么期望?
你有一个foo()方法在A调用foo()方法中B调用foo()方法A,依此类推,直到堆栈溢出.
您可以通过避免循环方法调用来解决它.
| 归档时间: |
|
| 查看次数: |
1176 次 |
| 最近记录: |